Windows的socket編程


################服務端

1.准備工作導入頭文件

1 #include<WinSock2.h>
2 #pragma comment(lib, "ws2_32.lib")
View Code

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 }
View Code

 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 }
View Code

 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");
View Code

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("綁定成功");
View Code

6.監聽

 listen的第二個參數是監聽的個數 , 等待連接的隊列最大長度

1 if(SOCKET_ERROR == listen(serverSocket, 10))
2 {
3   printf("監聽失敗");
4   closesocket(serverSocket);  //釋放socket
5   WSACleanup();  //關閉套接字
6   return ;  
7 }
8 printf("監聽成功");
View Code

 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));
View Code

 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 }
View Code

9.關閉socket

1 closesocket(clientSocket);
2 closesocket(serverSocket);
3 WSACleanup();
View Code

 

################客戶端

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 }
View Code

 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");
View Code

 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("連接成功");
View Code

 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 }
View Code

9.關閉socket

1 closesocket(clientSocket);
2 WSACleanup();
View Code


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM