Selectモデルによる通信プログラムの作成、コンパイル、実行

4639 ワード

タスクターゲット
Win 32プログラムシミュレーションを作成し、Selectモデルに基づく2台のコンピュータ間の通信を実現し、サーバ端とクライアント間の双方向データ転送をプログラミングすることを要求する。クライアントは、1から100までの奇数和の計算をサーバに送信し、サーバはクライアントに応答して、1から100までの奇数と結果を与える。
コアコード
Server:
1.  #include "InitSock.h"
2.  #include 
3.  #include 
4.  #include 
5.  CInitSock initSock;
6.  int main(int argc, char* argv[])
7.  {
8.      //     
9.      SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
10.     if(sListen == INVALID_SOCKET)
11.     {
12.         printf("socket error !");
13.         return 0;
14.     }
15. 
16.     //  IP   
17.     sockaddr_in sin;
18.     sin.sin_family = AF_INET;
19.     sin.sin_port = htons(5555);
20.     sin.sin_addr.S_un.S_addr = INADDR_ANY; 
21.     if(bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
22.     {
23.         printf("bind error !");
24.     }
25.     ::listen(sListen, 5);
26. 
27.     int itotal=0;
28.     int ii;
29.     for(ii=1;ii<=100;ii++)
30.     {
31.         if(ii % 2 ==1)
32.         {
33.             itotal+=ii;
34.         }
35.     }
36.     
37.     fd_set fdSocket;
38.     FD_ZERO(&fdSocket);
39.     FD_SET(sListen, &fdSocket);
40.     while(true) {
41.         fd_set fdRead = fdSocket;
42.         int nRet = ::select(0, &fdRead, NULL, NULL, NULL);
43.         if(nRet > 0) {
44.             for(int i=0; i 0) {
64.                             szText[nRecv] = '\0';
65.                             printf("     :%s
", szText); 66. 67. // 68. 69. char str[10]; 70. char str1[20]="1 100 :"; 71. itoa(itotal,str,10); 72. char * sendData = strcat(str1,str); 73. ::send(fdSocket.fd_array[i], sendData, strlen(sendData), 0); 74. 75. 76. } 77. else { 78. ::closesocket(fdSocket.fd_array[i]); 79. FD_CLR(fdSocket.fd_array[i], &fdSocket); 80. } 81. } 82. } 83. } 84. 85. 86. } 87. else { 88. printf(" !
"); 89. break; 90. } 91. } 92. return 0; 93. } 94. 95. Client: 1. #include "winsock2.h" 2. #include 3. #pragma comment(lib, "ws2_32.lib") 4. using namespace std; 5. BOOL RecvLine(SOCKET s, char* buf); // 6. int main(int argc, char* argv[]) 7. { 8. const int BUF_SIZE = 64; 9. WSADATA wsd; //WSADATA 10. SOCKET sHost; // 11. SOCKADDR_IN servAddr; // 12. char buf[BUF_SIZE]; // 13. char bufRecv[BUF_SIZE]; 14. int retVal; // 15. //WSAStartup() 16. if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) 17. { 18. cout << "WSAStartup failed!" << endl; 19. return -1; 20. } 21. //socket() 22. sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 23. if(INVALID_SOCKET == sHost) 24. { 25. cout << "socket failed!" << endl; 26. WSACleanup();// 27. return -1; 28. } 29. // 30. servAddr.sin_family =AF_INET; 31. servAddr.sin_addr.s_addr = inet_addr("172.21.0.140"); servAddr.sin_port = htons((short)5555); 32. int nServAddlen = sizeof(servAddr); 33. //connet() 34. retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr)); 35. if(SOCKET_ERROR == retVal) 36. { 37. cout << "connect failed!" << endl; 38. closesocket(sHost); // 39. WSACleanup(); // 40. return -1; 41. } 42. int FLAG = 1; 43. //while(true) 44. while(FLAG) 45. { 46. //send() 47. ZeroMemory(buf, BUF_SIZE); 48. char sendM[] = " 1 100 "; 49. retVal = send(sHost, sendM, strlen(sendM), 0); 50. if (SOCKET_ERROR == retVal) 51. { 52. cout << "send failed!" << endl; 53. closesocket(sHost); // 54. WSACleanup(); // 55. return -1; 56. } 57. //Recv() 58. ZeroMemory(bufRecv, BUF_SIZE); 59. recv(sHost, bufRecv,BUF_SIZE , 0); // , 5 cout << endl <
転載先:https://www.cnblogs.com/boxker/p/10745487.html