測試隨筆
阿新 • • 發佈:2021-12-07
(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( intargc, 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 }