################服務端
1.准備工作導入頭文件
1 #include<WinSock2.h> 2 #pragma comment(lib, "ws2_32.lib")
2.確定版本信息
MSAStartup :異步套接字的啟動命令 . 第一個參數是版本請求,高階字節是修訂版本,低階字節是主版本號
第二個參數是一個結構體,接收socket的實現細節
1 WSADATA wsaData; 2 WSAStartup(MAKEWORD(2,2),&wsaData); 3 if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2) 4 { 5 printf("請求版本失敗"); 6 return ; 7 }
3.創建socket
第一個參數表示要使用的協議族 : AF_INET IPv4的地址 和 端口號(16位)的組合
第二個參數表示類型 SOCK_STREAM 流式socket , 面向連接的socket
第三個參數指定協議 IPPROTO_TCP 使用 TCP 傳輸協議
1 SOCKET serverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP) 2 if(INVALID_SOCKET == severSocket) 3 { 4 printf("套接字創建失敗"); 5 return ; 6 }
4.初始化協議地址族
1 SOCKADDR_IN serverAddr = {0}; //初始化協議地址 2 serverAddr.sin_family = AF_INET;//必須和創建socket的IP協議一致 3 serverAddr.sin_prot = htons(8888); //服務器端口,客戶端通過這個端口連接 4 5 //ip地址是點分格式的字符串 , 用inet_addr來轉換整數 6 serverAddr.sin_addr.S_un.S_addr = inet_addr("172.0.0.1");
5.綁定
1 if(SOCKET_ERROR == bind(serverSocket , (SOCKADDR*)&serverAddr , sizeof(serverAddr))) 2 { 3 printf("綁定失敗"); 4 closesocket(serverSocket); //釋放socket 5 WSACleanup(); //關閉套接字 6 return ; 7 } 8 printf("綁定成功");
6.監聽
listen的第二個參數是監聽的個數 , 等待連接的隊列最大長度
1 if(SOCKET_ERROR == listen(serverSocket, 10)) 2 { 3 printf("監聽失敗"); 4 closesocket(serverSocket); //釋放socket 5 WSACleanup(); //關閉套接字 6 return ; 7 } 8 printf("監聽成功");
7.接受連接
accetp 第二第三個參數可以給NULL 表示不保存連接進來的客戶端(ip)信息 , 不給NULL 表示保存客戶端信息
1 SOCKADDR_IN clientAddr = {0}; 2 int len = sizeof(clientAddr); 3 SOCKET clientSocket = accept(serverSocket,(SOCKADDR*)&clientAddr, &len); //阻塞函數 4 if(clientSocket == INVALID_SOCKET) 5 { 6 printf("連接失敗"); 7 closesocket(serverSocket); //釋放socket 8 WSACleanup(); //關閉套接字 9 return ; 10 } 11 printf("連接成功"); 12 printf("客戶端(%s)\n" , inet_ntoa(clientAddr.sin_addr));
8.開始通訊
recv的第一個參數表示客戶端的socket 進行接收數據 , 第四個參數表示收發方式默認為0, 一次收完
1 char recvBuff[128] = {}; 2 while(1) 3 { 4 memset(recvBuff, 0 , sizeof(recvBuff)); 5 if(recv(clientSocket , recvBuff, sizeof(recvBuff)-1 , 0) >0) //阻塞函數 6 { 7 printf(">>%s\n" , recvBuff); 8 } 9 10 char sendBuff[128] = {}; 11 memset(sendBuff, 0 , sizeof(sendBuff)); 12 printf("請輸入:\n"); 13 scanf_s("%s" , sendBuff, sizeof(sendBuff)-1); 14 //一次收發 15 send(clientSocket , sendBuff, strlen(sendBuff), 0); 16 }
9.關閉socket
1 closesocket(clientSocket); 2 closesocket(serverSocket); 3 WSACleanup();
################客戶端
1.准備工作導入頭文件
View Code
2.確定版本信息
MSAStartup :異步套接字的啟動命令 . 第一個參數是版本請求,高階字節是修訂版本,低階字節是主版本號
第二個參數是一個結構體,接收socket的實現細節
View Code
3.創建socket
第一個參數表示要使用的協議族 : AF_INET IPv4的地址 和 端口號(16位)的組合
第二個參數表示類型 SOCK_STREAM 流式socket , 面向連接的socket
第三個參數指定協議 IPPROTO_TCP 使用 TCP 傳輸協議
1 SOCKET clientSocket= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP) 2 if(INVALID_SOCKET == clientSocket) 3 { 4 printf("套接字創建失敗"); 5 return ; 6 }
4.初始化協議地址族(初始化的是服務端的ip地址及端口, 表示連接用)
1 SOCKADDR_IN clientAddr = {0}; //初始化協議地址 2 clientAddr.sin_family = AF_INET;//必須和創建socket的IP協議一致 3 clientAddr.sin_prot = htons(8888); //服務器端口,客戶端通過這個端口連接 4 5 //ip地址是點分格式的字符串 , 用inet_addr來轉換整數 6 clientAddr.sin_addr.S_un.S_addr = inet_addr("172.0.0.1");
5.連接
1 if(SOCKET_ERROR == connect(clientSocket , (sockaddr *)&clientAddr , sizeof(clientAddr))) 2 { 3 printf("連接失敗"); 4 closesocket(clientSocket); //釋放socket 5 WSACleanup(); //關閉套接字 6 return ; 7 } 8 printf("連接成功");
8.開始通訊
recv的第一個參數表示客戶端的socket 進行接收數據 , 第四個參數表示收發方式默認為0, 一次收完
1 char sendBuff[128] = {}; 2 while(1) 3 { 4 memset(sendBuff, 0 , sizeof(sendBuff)); 5 printf("請輸入:\n"); 6 scanf_s("%s" , sendBuff, sizeof(sendBuff)-1); 7 //一次收發 8 send(clientSocket , sendBuff, strlen(sendBuff), 0); 9 10 char recvBuff[128] = {}; 11 memset(recvBuff, 0 , sizeof(recvBuff)); 12 if(recv(clientSocket , recvBuff, sizeof(recvBuff)-1 , 0) >0) //阻塞函數 13 { 14 printf(">>%s\n" , recvBuff); 15 } 16 }
9.關閉socket
1 closesocket(clientSocket); 2 WSACleanup();
