윈도우즈에서udp 연결 & 패키지 분실 해결

2601 단어
서버:
#pragma comment (lib,"ws2_32.lib")

int _tmain(int argc, _TCHAR* argv[])
{   
	WSADATA wsaData; 
	int error=WSAStartup(MAKEWORD(1,1),&wsaData);
	if(error!=0)
	{
		return -1;
	}

	if(LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)
	{
		WSACleanup();
		return -1;
	}

	SOCKET s=socket(AF_INET,SOCK_DGRAM,0);
	SOCKADDR_IN sockSrc;
	sockSrc.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
	sockSrc.sin_port=htons(8888);
	sockSrc.sin_family=AF_INET;

	bind(s,(SOCKADDR *)&sockSrc,sizeof(SOCKADDR));

	unsigned char recBuff[32*1024];
	setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&recBuff,sizeof(int));
	memset(recBuff,0,32*1024);
 
	SOCKADDR_IN sockRec;
	int len=sizeof(SOCKADDR);
	int x=-1;
	int i = 1;
	FILE* pf;
	
	if(0 != fopen_s(&pf, ".//receive.txt","a+"))
	{
		printf("fopen error!
"); } while(1) { x=recvfrom(s,(char*)recBuff,sizeof(recBuff),0,(sockaddr *)&sockRec,&len); printf("the receive is:
"); for(int i = 0; i < x; i++) { printf("%d",recBuff[i]); } printf("
"); fwrite(recBuff,x,1,pf); memset(recBuff,0,32*1024); printf("receive:%d num is %d============================
",x,i++); } closesocket(s); fclose(pf); WSACleanup(); return 0; }

클라이언트:
#include "stdafx.h"
#pragma comment (lib,"ws2_32.lib")


int _tmain(int argc, _TCHAR* argv[])
{
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
 
	wVersionRequested = MAKEWORD( 1, 1 );
 
	 err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) 
	{
		return -1;
	}
 
	if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) 
	{
		WSACleanup( );
		return -1; 
	}
	SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.31.127");
	addrSrv.sin_family=AF_INET;
	addrSrv.sin_port=htons(8888);
	while(1)
	{
		sendto(sockClient,"Hello",strlen("Hello")+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
	}
	closesocket(sockClient);
	WSACleanup();
	return 0;
}

서버가 보낸 데이터는 5*256개의char 데이터입니다. 서버를 작성할 때 캐시 구역을char[2000]로 설정합니다.그리고 매번 받은 데이터를 인쇄합니다.그리고 가방을 잃어버리는 현상이 발견되었다.나중에 지도를 받다.강의 캐시 구역이 크게 바뀌었다.문제가 해결되었다.
서버를 작성할 때 캐시 영역을char[2000]로 설정합니다.서비스 쪽에서 보낸 데이터를 수신하는 데 쓰인다.서버
int nRecvBuf=32*1024;//32K로 설정하고 설정을 바꾸세요.
그리고 setsockopt라는 함수를 통해 socket에 알립니다.setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
서버를 작성할 때 캐시 영역을char[2000]로 설정합니다.서비스 쪽에서 보낸 데이터를 수신하는 데 쓰인다.서버

좋은 웹페이지 즐겨찾기