1. 程式人生 > 其它 >DP 做題記錄 II.

DP 做題記錄 II.

(1)伺服器端程式碼

  1 #include <stdio.h>
  2 // Winsock是一個基於Socket模型的API
  3 #include <winsock2.h>
  4 
  5 // 要包含標頭檔案 Winsock2.h,就需要呼叫庫 ws2_32.lib
  6 #pragma comment( lib, "ws2_32.lib" )
  7 
  8 
  9 
 10 /* Winsock啟動測試,檢查系統協議棧安裝情況 */
 11 void TestWinsockStartup();
 12 
 13 
 14 
 15 int main( int
argc, char* argv[] ) { 16 // 0. Winsock啟動測試 17 TestWinsockStartup(); 18 19 20 SOCKET sListen, sAccept; 21 // 客戶端地址長度、傳送資料長度 22 int iLen, iSend; 23 // 要傳送給客戶的資訊 24 char buf[] = "Hello World! from NCHU!"; 25 // 伺服器和客戶的地址 26 struct sockaddr_in ser, cli;
27 // 初始化客戶地址長度 28 iLen = sizeof(cli); 29 30 // 1. 建立伺服器端通訊套接字 31 sListen = socket( AF_INET, SOCK_STREAM, 0 ); 32 if( sListen == INVALID_SOCKET ) { 33 printf("socket() Failed: %d\n", WSAGetLastError()); 34 return -1; 35 } 36 37 // 2. 將建立的套接字與伺服器地址進行繫結
38 ser.sin_family = AF_INET; 39 ser.sin_port = htons( 5050 ); // 埠號 5050 40 ser.sin_addr.s_addr = htonl( INADDR_ANY ); 41 if( bind(sListen, (LPSOCKADDR)&ser, sizeof(ser)) == SOCKET_ERROR ){ 42 printf("bind() Failed: %d\n", WSAGetLastError()); 43 return -1; 44 } 45 46 // 3. 進入監聽狀態 47 if( listen(sListen, 5) == SOCKET_ERROR ) { 48 printf("lisiten() Failed: %d\n", WSAGetLastError()); 49 return -1; 50 } 51 52 // 4. 進入一個無限迴圈,等待客戶的連線請求 53 while(1) { 54 // 4.1 接收來自客戶端由 connect()發出的連線請求 55 sAccept = accept( sListen, (struct sockaddr *)&cli, &iLen ); 56 if( sAccept == INVALID_SOCKET ) { 57 printf("accept() Failed: %d\n", WSAGetLastError()); 58 return -1; 59 } 60 // 輸出客戶 IP地址和埠號 61 printf("Accepted client IP:[%s], port:[%d]\n", inet_ntoa(cli.sin_addr), ntohs(cli.sin_port)); 62 63 // 4.2 給連線的客戶傳送資訊 64 iSend = send( sAccept, buf, sizeof(buf), 0 ); 65 if( iSend == SOCKET_ERROR ) { 66 printf("send() Failed: %d\n", WSAGetLastError()); 67 break; 68 } else if(iSend == 0) { 69 break; 70 } else { 71 // 成功傳送資料 72 printf("send() byte: %d\n", iSend); 73 } 74 closesocket(sAccept); 75 } 76 77 closesocket(sListen); 78 WSACleanup(); 79 return 0; 80 } 81 82 83 84 /* Winsock啟動測試,檢查系統協議棧安裝情況 */ 85 void TestWinsockStartup() { 86 WORD wVersionRequested; 87 WSADATA wsaData; 88 wVersionRequested = MAKEWORD(2, 2); 89 90 if( WSAStartup(wVersionRequested, &wsaData) != 0 ) { 91 printf("Winsock初始化錯誤!\n"); 92 return ; 93 } 94 if( wsaData.wVersion != wVersionRequested ) { 95 printf("Winsock版本不匹配!\n"); 96 WSACleanup(); 97 return ; 98 } 99 printf("WinsockDLL正確載入!\n"); 100 }

(2)客戶端程式碼

 1 #include <stdio.h>
 2 // Winsock是一個基於Socket模型的API
 3 #include <winsock2.h>
 4 
 5 // 要包含標頭檔案 Winsock2.h,就需要呼叫庫 ws2_32.lib
 6 #pragma comment( lib, "ws2_32.lib" )
 7 
 8 
 9 
10 /* Winsock啟動測試,檢查系統協議棧安裝情況 */
11 void TestWinsockStartup();
12 
13 
14 
15 int main( int argc, char* argv[] ) {
16     // 0. Winsock啟動測試
17     TestWinsockStartup();
18     
19     SOCKET sClient;
20     // 從伺服器端接收的資料長度
21     int iLen;
22     // 接收資料的緩衝區
23     char buf[1024];
24     //接收緩衝區初始化
25     memset( buf, 0, sizeof(buf) );
26     // 伺服器端地址
27     struct sockaddr_in ser;
28     
29     // 命令列引數輸入是否正確:client [Server IP] 
30     if( argc < 2 ) {
31         //提示在命令列中輸入伺服器 IP地址
32         printf("Usage: client [server IP address]\n");
33         return -1;
34     }
35     
36     // 1. 填寫要連線的伺服器地址資訊
37     ser.sin_family = AF_INET;
38     ser.sin_port = htons( 5050 );
39     // 將命令列中輸入的點分 IP地址轉換為二進位制表示的網路位元組序 IP地址
40     ser.sin_addr.s_addr = inet_addr( argv[1] );
41     
42     // 2. 建立客戶端流式套接字
43     sClient = socket( AF_INET,SOCK_STREAM, 0 );
44     if( sClient == INVALID_SOCKET ) {
45         printf("socket() Failed: %d\n", WSAGetLastError());
46         return -1;
47     }
48 
49     // 3. 請求與伺服器端建立 TCP連線
50     if( connect(sClient, (struct sockaddr *)&ser, sizeof(ser)) == INVALID_SOCKET ) {
51         printf("connect() Failed: %d\n", WSAGetLastError());
52         return -1;
53     } else {
54         // 從伺服器端接收資料
55         iLen = recv( sClient, buf, sizeof(buf), 0 );
56         if( iLen == 0 ) {
57             return -1;
58         } else if( iLen == SOCKET_ERROR ) {
59             printf("recv() Failed: %d\n", WSAGetLastError());
60             return -1;
61         } else {
62             // 輸出接收到的資料 
63             printf("recv() data from server: %s\n", buf);
64         }
65     }
66     
67     closesocket(sClient);
68     WSACleanup();
69     return 0;
70 }
71 
72 
73 
74 /* Winsock啟動測試,檢查系統協議棧安裝情況 */
75 void TestWinsockStartup() {
76     WORD wVersionRequested;
77     WSADATA wsaData;
78     wVersionRequested = MAKEWORD(2, 2);
79     
80     if( WSAStartup(wVersionRequested, &wsaData) != 0 ) {
81         printf("Winsock初始化錯誤!\n");
82         return ;
83     }
84     if( wsaData.wVersion != wVersionRequested ) {
85         printf("Winsock版本不匹配!\n");
86         WSACleanup();
87         return ;
88     }
89     printf("WinsockDLL正確載入!\n");
90 }