windows socket编程实例-UDP(2007-07-22 14:05)

来源:互联网 发布:南风知我意2下载 编辑:程序博客网 时间:2024/06/04 00:34
 

写了个mudp类, 省去了一些比较讨厌的实现细节...

刚开始把closesocket放在了析构函数里, 导致调用copyconstructor时把socket给关了=.=

发送和接收的example都在一个main里面了.

项目属性那还得设置为多线程

  1. #include "stdio.h"
  2. #include "winsock2.h"
  3. #pragma     comment(lib,"WS2_32.LIB")
  4. class mudp{
  5. public:
  6.       SOCKET socket1;
  7.       sockaddr_in local;//本地地址
  8.       sockaddr_in from;//udp包来源地址
  9.       sockaddr_in dir;//目标地址
  10.       int len;//上面这些东西的大小
  11.       char buffer[1024];//内部用的缓冲
  12. public:
  13.       mudp(int port);//需要receive的话,提供一个port
  14.       mudp();//不需要receive则不必提供
  15.       void close();//关闭socket
  16.       bool receive(char* mes,char* address,int& port);//udp包的信息,地址,端口号
  17.       bool receive(char* mes);//只接收信息
  18.       void setaddress(char* ip,int port);//设置目的地址
  19.       bool send(char* mes,int size,char* address,int port);//发到信息到参数指定的地址,size为信息长度
  20.       bool send(char* mes,int size);//发到信息到dir指定的地址,size为信息长度
  21.       bool sendlast(char* mes,int size);//发送到上次接收udp包的来源地址
  22. };
  23. mudp::mudp(int port){
  24.       len =sizeof(from);
  25.       from.sin_family=AF_INET;
  26.       local.sin_family=AF_INET;
  27.       local.sin_port=htons(port); 
  28.       local.sin_addr.s_addr=INADDR_ANY; 
  29.       from=dir=local;
  30.       socket1=socket(AF_INET,SOCK_DGRAM,0);
  31.       bind(socket1,(struct sockaddr*)&local,len);
  32. }
  33. mudp::mudp(){
  34.       len =sizeof(from);
  35.       from.sin_family=AF_INET;
  36.       socket1=socket(AF_INET,SOCK_DGRAM,0);
  37. }
  38. void mudp::close(){
  39.       closesocket(socket1);
  40. }
  41. bool mudp::receive(char* mes,char* address,int& port){
  42.       if (recvfrom(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&from,&len)!=SOCKET_ERROR){
  43.           strcpy(mes,buffer);
  44.           strcpy(address,inet_ntoa(from.sin_addr));
  45.           port=from.sin_port;
  46.           return true;
  47.       }
  48.       else{
  49.           return false;
  50.       }
  51. }
  52. bool mudp::receive(char* mes){
  53.       if (recvfrom(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&from,&len)!=SOCKET_ERROR){
  54.           strcpy(mes,buffer);
  55.           return true;
  56.       }
  57.       else{
  58.           return false;
  59.       }
  60. }
  61. void mudp::setaddress(char* ip,int port){
  62.       dir.sin_port=htons(port); 
  63.       dir.sin_addr.s_addr=inet_addr(ip);
  64. }
  65. bool mudp::send(char* mes,int size,char* address,int port){    
  66.       dir.sin_family=AF_INET;
  67.       dir.sin_addr.s_addr=inet_addr(address); 
  68.       dir.sin_port=htons(port);
  69.       if(sendto(socket1,mes,size,0,(struct sockaddr*)&dir,len)!=SOCKET_ERROR){
  70.           return true;
  71.       }
  72.       return false;
  73. }
  74. bool mudp::send(char* mes,int size){
  75.       if(sendto(socket1,mes,size,0,(struct sockaddr*)&dir,len)!=SOCKET_ERROR){
  76.           return true;
  77.       }
  78.       return false;
  79. }
  80. bool mudp::sendlast(char* mes,int size){
  81.       if(sendto(socket1,mes,size,0,(struct sockaddr*)&from,len)!=SOCKET_ERROR){
  82.           return true;
  83.       }
  84.       return false;
  85. }
  86. HANDLE hlisten;
  87. mudp sock;
  88. void mlisten(void* arg){
  89.       char str[1024];
  90.       char ip[30];
  91.       int port;
  92.       printf("thread started/n");
  93.       while(1){
  94.           if(sock.receive(str,ip,port)){
  95.               printf("message received from %s:%d/n%s/n",ip,port,str);
  96.               if(strcmp(str,"quit")==0){
  97.                   break;
  98.               }
  99.           }
  100.           else{
  101.               printf("can not reveive message/n");
  102.           }
  103.       }
  104.       printf("listen thread quit/n");
  105. }
  106. void main(){
  107.       WSADATA wsaData;
  108.       if (WSAStartup(MAKEWORD(2,1),&wsaData)){
  109.            printf("Winsock initializing fail/n");
  110.            WSACleanup();
  111.            return;
  112.       }
  113.       sock=mudp(12345);
  114.       hlisten=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) mlisten,NULL,CREATE_SUSPENDED,NULL);
  115.       ResumeThread(hlisten);
  116.       if(hlisten==NULL){
  117.           printf("thread create fail/n");
  118.       }
  119.       char str[1024];
  120.       mudp a(54321);
  121.       a.setaddress("172.18.48.7",12345);
  122.       while(1){
  123.           scanf("%s",str);
  124.           a.send(str,1024);
  125.           if(strcmp(str,"quit")==0){
  126.               break;
  127.           }
  128.       }
  129.       Sleep(100);
  130.       sock.close();
  131.       WSACleanup();
  132. }
原创粉丝点击