這一節是計算機網絡作業,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 }
模擬運行結果如下:
實驗完畢,完全照抄的,呵呵!