○UDP通信

マルチスレッドにて、送受信を行っても、問題は無いようです。
ネットワークイベントを使うのが本来の方法ですよね。

#pragma comment(lib, "wsock32.lib")
#include <winsock2.h>
#include <stdio.h>

//送信クライアント
int UDPClient(char*ServerName,unsigned short PortNo,char *buff,int len){

	HOSTENT*pHostent=gethostbyname(ServerName);
	if(pHostent==NULL){
		DWORD addr=inet_addr(ServerName);
		pHostent=gethostbyaddr((char*)&addr,4,AF_INET);
	}
	if(pHostent==NULL) return -1;//サーバーが見つかりません
	
	SOCKET s = socket(AF_INET,SOCK_DGRAM,0);
	if(s<0) return -2;//ソケットエラー
	
	SOCKADDR_IN sockaddrin;
	memset(&sockaddrin,0,sizeof(sockaddrin));
	memcpy(&(sockaddrin.sin_addr),pHostent->h_addr_list[0],pHostent->h_length);
	sockaddrin.sin_family = AF_INET;
	sockaddrin.sin_port = htons(PortNo);
	
	//送信
	int re = sendto(s,buff,len,0,(LPSOCKADDR)&sockaddrin,sizeof(sockaddrin));

	closesocket(s);

	return re;
}

//受信サーバー
int UDPServer(unsigned short PortNo){

	SOCKET s = socket(AF_INET,SOCK_DGRAM,0);
	if(s<0) return -1;//ソケットエラー
	
	SOCKADDR_IN sockaddrin;
	memset(&sockaddrin,0,sizeof(sockaddrin));
	sockaddrin.sin_family = AF_INET;
	sockaddrin.sin_port = htons(PortNo);
	if(SOCKET_ERROR==bind(s,(LPSOCKADDR)&sockaddrin,(int)sizeof(sockaddrin))){
		closesocket(s);
		return -2;//bindエラー
	}
	char buff[1024];
	SOCKADDR_IN from;
	int fromlen=(int)sizeof(from);

	while(1){//受信の無限ループになっています。
		int re=recvfrom(s,buff,(int)sizeof(buff)-1,0,(SOCKADDR*)&from,&fromlen);//受信するまでここで停止
		if(re!=SOCKET_ERROR){//エラーで無ければ表示
			buff[re]='\0';
			printf(buff);
		}
	}

	closesocket(s);
	return 0;
}


int main(char *args[]){

	//winsockの初期化
	WSADATA wsadata;
	WSAStartup(MAKEWORD(1,1),&wsadata);

	////送信するには------------------------------------------------
	////送信バイト数=UDPclient(アドレス,ポート番号,送信文字列,送信文字サイズ);
	//char*str="いなばてすと";
	//int re=UDPClient("localhost",1000,str,strlen(str));
	//printf("%dバイト送信しました\n",re);
	
	////受信するには------------------------------------------------
	////UDPServer(ポート番号);
	//UDPServer(1000);

	//winsockのクリーンアップ
	WSACleanup();

	return 0;
}



▲トップページ > Windows と C++