WinSocket簡單編程實驗


      這一節是計算機網絡作業,windows socket編程,老師電腦上開一個服務器程序,公開ip地址和端口號,我們同學自己編寫一個客戶端,能與老師的服務器建立聯系,兩者能收發即可。這樣的代碼網上很多,而是就采用了孫鑫VC++第14講的代碼,下面是添加的一點簡單注釋。

      其實socket完成連接功能很簡單,依葫蘆畫瓢即可。首先來看面向連接的TCP流程圖。

     

      面向無連接的UDP流程更加簡單,如下所示:

     

      現在用TCP協議來完成任務,下面是孫鑫老師的代碼,由於我們要提前測試自己的代碼,所以也用了服務器端的代碼,服務器端端server代碼如下:

 1 #include <Winsock2.h>
 2 #include <stdio.h>
 3 
 4 void main()
 5 {
 6     // 以下的幾句都是固定的
 7     WORD wVersionRequested;
 8     WSADATA wsaData;
 9     int err;
10     
11     wVersionRequested = MAKEWORD( 1, 1 );
12     
13     err = WSAStartup( wVersionRequested, &wsaData );//該函數的功能是加載一個Winsocket庫版本
14     if ( err != 0 ) {
15         return;
16     }
17     
18 
19     if ( LOBYTE( wsaData.wVersion ) != 1 ||
20         HIBYTE( wsaData.wVersion ) != 1 ) {
21         WSACleanup( );
22         return; 
23     }
24 
25 
26     //真正socket編程部分
27     SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//面向連接的可靠性服務SOCK_STRAM
28 
29     SOCKADDR_IN addrSrv;//存放本地地址信息的
30     addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//htol將主機字節序long型轉換為網絡字節序
31     addrSrv.sin_family=AF_INET;
32     addrSrv.sin_port=htons(6001);//htos用來將端口轉換成字符,1024以上的數字即可
33 
34     bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//將socket綁定到相應地址和端口上
35 
36     listen(sockSrv,5);//等待隊列中的最大長度為5
37 
38     SOCKADDR_IN addrClient;
39     int len=sizeof(SOCKADDR);
40 
41     while(1)
42     {
43         SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//建立一個新的套接字用於通信,不是前面的監聽套接字
44         char sendBuf[100];
45         sprintf(sendBuf,"Server IP is:%s",
46             inet_ntoa(addrClient.sin_addr));//inet_nota函數是將字符轉換成ip地址
47         send(sockConn,sendBuf,strlen(sendBuf)+1,0);//服務器向客戶端發送數據
48 
49         char recvBuf[100];
50         recv(sockConn,recvBuf,100,0);//服務器從客戶端接受數據
51         printf("%s\n",recvBuf);
52         closesocket(sockConn);//關閉socket
53     }
54 }

      客戶端client的代碼如下:

 1 #include <Winsock2.h>
 2 #include <stdio.h>
 3 
 4 void main()
 5 {
 6     //固定格式
 7     WORD wVersionRequested;
 8     WSADATA wsaData;
 9     int err;
10     
11     wVersionRequested = MAKEWORD( 1, 1 );
12     
13     err = WSAStartup( wVersionRequested, &wsaData );
14     if ( err != 0 ) {
15         return;
16     }
17     
18 
19     if ( LOBYTE( wsaData.wVersion ) != 1 ||
20         HIBYTE( wsaData.wVersion ) != 1 ) {
21         WSACleanup( );
22         return; 
23     }
24 
25     //建立通訊socket
26     SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
27 
28     SOCKADDR_IN addrSrv;
29     addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.24");//設定需要連接的服務器的ip地址
30     addrSrv.sin_family=AF_INET;
31     addrSrv.sin_port=htons(6001);//設定需要連接的服務器的端口地址
32     connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//與服務器進行連接
33 
34     //接受來自老師的信息
35     char recvBuf[100];
36     recv(sockClient,recvBuf,100,0);
37     printf("來自老師的信息:\n%s\n",recvBuf);
38 
39     //發送信息給老師
40     send(sockClient,"姓名:小明 學號:123456789,IP地址:192.168.1.14!",strlen("姓名:小明 學號:123456789,IP地址:192.168.1.14!")+1,0);
41 
42     closesocket(sockClient);
43     WSACleanup();
44 }

      模擬運行結果如下:

     

      實驗完畢,完全照抄的,呵呵!

 

 

 

 

 


免責聲明!

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



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