socket编程:select 用法 例子

来源:互联网 发布:易碎贴纸淘宝 编辑:程序博客网 时间:2024/05/01 03:26

鄢写的,参考之用

/////////////////////////////////////////////////////////////

服务器:

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <WINSOCK2.H>  
  4.   
  5. #pragma comment(lib,"ws2_32.lib")  
  6.   
  7. #define INT_SERVER_PORT 6002  
  8. #define STR_SERVER_IP "127.0.0.1"  
  9. #define INT_DATABUFFER_SIZE 100  
  10.   
  11. void main(void)  
  12. {  
  13.     WORD dwVersion = MAKEWORD(2,2);  
  14.     WSAData wsaData;  
  15.     WSAStartup(WINSOCK_VERSION,&wsaData);  
  16.   
  17.     SOCKET sockServer = socket(AF_INET,SOCK_STREAM,0);  
  18.     if (INVALID_SOCKET == sockServer)  
  19.     {  
  20.         printf("Failed to create socket!/r/n");  
  21.         WSACleanup();  
  22.         return;  
  23.     }  
  24.   
  25.     sockaddr_in addrServer;  
  26.     memset(&addrServer,0,sizeof(sockaddr_in));  
  27.     addrServer.sin_family = AF_INET;  
  28.     addrServer.sin_port = htons(INT_SERVER_PORT);  
  29.     addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  
  30.     //addrServer.sin_addr.s_addr = htonl(INADDR_ANY);  
  31.   
  32.     int iResult;  
  33.   
  34.     bool bReuseAddr=true;  
  35.     iResult=setsockopt(sockServer,SOL_SOCKET,SO_REUSEADDR,(char *)&bReuseAddr,sizeof(bReuseAddr));  
  36.     if(SOCKET_ERROR == iResult)  
  37.     {  
  38.         printf("Failed to set resueaddr socket!/r/n");  
  39.         WSACleanup();  
  40.         return;  
  41.     }  
  42.       
  43.     /* 
  44.     unsigned   long cmd = 1;  
  45.     iResult= ioctlsocket(sockServer,FIONBIO,&cmd); */  
  46.   
  47.     iResult = bind(sockServer,(sockaddr *)&addrServer,sizeof(addrServer));  
  48.     if (SOCKET_ERROR == iResult)  
  49.     {  
  50.         printf("Failed to bind address!/r/n");  
  51.         WSACleanup();  
  52.         return;  
  53.     }  
  54.   
  55.     if (0 != listen(sockServer,5))  
  56.     {  
  57.         printf("Failed to listen client!/r/n");  
  58.         WSACleanup();  
  59.         return;  
  60.     }  
  61.   
  62.     UINT i = 0;  
  63.     SOCKET sockAccept;  
  64.     sockaddr_in addrAccept;  
  65.     int iAcceptLen = sizeof(addrAccept);  
  66.     char szDataBuff[INT_DATABUFFER_SIZE];  
  67.     int iRecvSize;  
  68.       
  69.     sockaddr_in addrTemp;  
  70.     int iTempLen;  
  71.   
  72.     fd_set fd;  
  73.     FD_ZERO(&fd);  
  74.     FD_SET(sockServer,&fd);  
  75.   
  76.     /* 
  77.     timeval tm; 
  78.     tm.tv_sec = 0; 
  79.     tm.tv_usec = 1000; 
  80.     */  
  81.     printf("Start server.../r/n");  
  82.     while(1)  
  83.     {  
  84.         fd_set fdOld = fd;  
  85.         iResult = select(0,&fdOld,NULL,NULL,/*&tm*/NULL);  
  86.         if (0 <= iResult)  
  87.         {  
  88.             for(i = 0;i < fd.fd_count; i++)  
  89.             {  
  90.                 if (FD_ISSET(fd.fd_array[i],&fdOld))  
  91.                 {  
  92.                     //如果socket是服务器,则接收连接  
  93.                     if (fd.fd_array[i] == sockServer)  
  94.                     {  
  95.                         memset(&addrAccept,0,sizeof(addrTemp));  
  96.                         sockAccept = accept(sockServer,(sockaddr *)&addrAccept,&iAcceptLen);  
  97.                         if (INVALID_SOCKET != sockAccept)  
  98.                         {  
  99.                             FD_SET(sockAccept,&fd);  
  100.                             //FD_SET(sockAccept,&fdOld);  
  101.                             printf("%s:%d has connected server!/r/n",inet_ntoa(addrAccept.sin_addr),  
  102.                                 ntohs(addrAccept.sin_port));  
  103.                         }  
  104.                     }  
  105.                     else //非服务器,接收数据(因为fd是读数据集)  
  106.                     {  
  107.                         memset(szDataBuff,0,INT_DATABUFFER_SIZE);  
  108.                         iRecvSize = recv(fd.fd_array[i],szDataBuff,INT_DATABUFFER_SIZE,0);  
  109.                         memset(&addrTemp,0,sizeof(addrTemp));  
  110.                         iTempLen = sizeof(addrTemp);  
  111.                         getpeername(fd.fd_array[i],(sockaddr *)&addrTemp,&iTempLen);  
  112.                           
  113.                         if (SOCKET_ERROR == iRecvSize)  
  114.                         {  
  115.                             closesocket(fd.fd_array[i]);  
  116.                             FD_CLR(fd.fd_array[i],&fd);  
  117.                             i--;  
  118.                             printf("Failed to recv data ,%s:%d errorcode:%d./r/n",  
  119.                                 inet_ntoa(addrTemp.sin_addr),ntohs(addrTemp.sin_port),WSAGetLastError());  
  120.                             continue;  
  121.                         }  
  122.   
  123.                         if (0 == iRecvSize)  
  124.                         {  
  125.                             //客户socket关闭  
  126.                             printf("%s:%d has closed!/r/n",inet_ntoa(addrTemp.sin_addr),  
  127.                                 ntohs(addrTemp.sin_port));  
  128.                               
  129.                             closesocket(fd.fd_array[i]);  
  130.                             FD_CLR(fd.fd_array[i],&fd);  
  131.                             i--;      
  132.                         }  
  133.                           
  134.                         if (0 < iRecvSize)  
  135.                         {  
  136.                             //打印接收的数据  
  137.                             printf("recv %s:%d data:%s/r/n",inet_ntoa(addrTemp.sin_addr),  
  138.                                 ntohs(addrTemp.sin_port),szDataBuff);  
  139.                         }  
  140.                     }     
  141.                 }  
  142.             }  
  143.         }  
  144.         else if (SOCKET_ERROR == iResult)  
  145.         {  
  146.             //WSACleanup();   
  147.         //  printf("Faild to select sockt in server!/r/n");  
  148.             Sleep(100);  
  149.         }  
  150.     }  
  151.     WSACleanup();  
  152. }  

/////////////////////////////////////////////////////////////

客户端:

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <WINSOCK2.H>  
  4.   
  5. #pragma comment(lib,"ws2_32.lib")  
  6.   
  7. #define INT_SERVER_PORT 6002  
  8. #define STR_SERVER_IP "127.0.0.1"  
  9. #define INT_DATABUFFER_SIZE 100  
  10. #define STR_EXIT "exit"  
  11.   
  12. void main(void)  
  13. {  
  14.     WSAData wsaData;  
  15.     WSAStartup(WINSOCK_VERSION,&wsaData);  
  16.   
  17.     SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);  
  18.     if (INVALID_SOCKET == sockClient)  
  19.     {  
  20.         printf("Failed to create client!/r/n");  
  21.         WSACleanup();  
  22.     }  
  23.   
  24.     sockaddr_in addrClient;  
  25.     addrClient.sin_addr.S_un.S_addr = inet_addr(STR_SERVER_IP);  
  26.     addrClient.sin_family = AF_INET;  
  27.     addrClient.sin_port = htons(INT_SERVER_PORT);  
  28.   
  29.       
  30.     int iResult;  
  31.     iResult = connect(sockClient,(sockaddr *)&addrClient,sizeof(sockaddr_in));  
  32.     if (SOCKET_ERROR == iResult)  
  33.     {  
  34.         printf("Failed to connect server!/r/n");  
  35.         WSACleanup();  
  36.         return;   
  37.     }   
  38.   
  39.     if (0 != iResult)  
  40.     {  
  41.         int iErrorCode;  
  42.         iErrorCode = WSAGetLastError();  
  43.         printf("Failed to connect server,error:%d./r/n",iErrorCode);  
  44.         WSACleanup();  
  45.         return;  
  46.     }  
  47.     char szDataBuffer[INT_DATABUFFER_SIZE];  
  48.     while(1)  
  49.     {  
  50.         memset(szDataBuffer,0,INT_DATABUFFER_SIZE);  
  51.         scanf("%s",szDataBuffer);  
  52.   
  53.         if (0 == strcmp(szDataBuffer,STR_EXIT))  
  54.         {  
  55.             printf("The client has stopped!/r/n");  
  56.             break;  
  57.         }  
  58.         else  
  59.         {  
  60.             if (1 > send(sockClient,szDataBuffer,strlen(szDataBuffer),0))  
  61.             {  
  62.                 printf("Failed to send data!/r/n");  
  63.             }  
  64.         }  
  65.         Sleep(100);  
  66.     }  
  67.     closesocket(sockClient);  
  68.     WSACleanup();  
  69.   
  70. }  

原创粉丝点击