○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++