初步研究了win32平臺的Windows Sockets,它是Microsoft Windows的網絡程序設計接口,它是從Berkeley Sockets擴展而來的,以動態連接庫的形式提供給咱們使用。包括流式套接字(提供面向鏈接、可靠的數據傳輸服務,數據無差錯、無重複的發送,且按發送順序接收。)和數據報套接字(提供無鏈接服務。數據包以獨立包形式發送,不提供無錯保證,數據可能丟失或重複,而且接收順序混亂。)、原始套接字。ios
CS模型:在TCP/IP網絡應用中,通訊的兩個進程間相互做用的主要模式是客戶機/服務器模式(client/server),即客戶向服務器提出請求,服務器接收到請求後,提供相應的服務。編程
基於TCP(面向鏈接)的socket編程:服務器
Sever服務器端程序: 一、建立套接字(socket)。 二、將套接字綁定到一個本地地址和端口上(bind)。 三、將套接字設爲監聽模式,準備接收客戶請求(listen)。 四、等待客戶請求到來;當請求到來後,接受鏈接請求,返回一個新的對應於這次鏈接的套接字(accept)。 五、用返回的套接字和客戶端進行通訊(send/recv)。 六、返回,等待另外一客戶請求。 七、關閉套接字。網絡
Client客戶端程序: 一、建立套接字(socket)。 二、向服務器發出鏈接請求(connect)。 三、和服務器端進行通訊(send/recv)。 四、關閉套接字。app
TCP/IP模型編程流程以下圖:socket
Socket的服務器段詳細註釋代碼:ide
1 // server6.cpp : Defines the entry point for the console application. 2 // 3 //TcpServer.cpp 4 #include <winsock2.h> 5 #include <stdio.h> 6 #pragma comment(lib,"ws2_32.lib") 7 #include <iostream> 8 using namespace std; 9 void main() 10 { 11 WORD wVersionRequested; 12 WSADATA wsaData; 13 int err; 14 wVersionRequested = MAKEWORD( 1, 1 );//SDK這個宏建立一個無符號16位整形,經過鏈接兩個給定的無符號參數。表示1.1版本 15 err = WSAStartup( wVersionRequested, &wsaData );//經過WSAStartup函數完成對Winsock服務的初始化,調用socket必須初始化 16 if ( err != 0 ) { 17 return; 18 } 19 if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )//若是版本錯誤返回 20 { 21 WSACleanup( );//釋放WSAStartup 22 return; 23 } 24 SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0); //創建本地流式套接字,返回套接字號;af_inet地址族,用流式套接字,自動匹配 25 SOCKADDR_IN addrSrv;//TCP/IP的地址信息 26 addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//容許套接字向任何分配給本地機器的IP地址發送或接收數據。 27 addrSrv.sin_family = AF_INET;//TCP指定的 28 addrSrv.sin_port = htons(6000);//端口號 29 bind(sockSrv,(sockaddr*)&addrSrv,sizeof(SOCKADDR));//綁定套接字 30 listen(sockSrv,5);//#####監聽本地套接字 31 SOCKADDR_IN addrClient; 32 int len = sizeof(SOCKADDR); 33 char revBuf[100],sendBuf[100]; 34 35 while(1) 36 { 37 SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);//接受連接等待客戶端連接,返回客戶套接字 38 char sendBuf[100]; 39 cout<<"我說:\n"; 40 //sprintf(sendBuf,"Welcome %s to chat with me!",inet_ntoa(addrClient.sin_addr)); 41 cin>>sendBuf; 42 send(sockConn,sendBuf,strlen(sendBuf)+1,0); 43 44 45 recv(sockConn,revBuf,100,0); 46 cout<<"對方說:\n"; 47 printf("%s\n",revBuf); 48 memset(revBuf,0,100); 49 closesocket(sockConn); 50 } 51 closesocket(sockSrv); 52 }
Socket的客戶端詳細註釋代碼:函數
1 //TcpClient.cpp 2 #include <stdio.h> 3 #include <winsock2.h> 4 #pragma comment(lib,"ws2_32.lib") 5 #include <iostream> 6 using namespace std; 7 void main() 8 { 9 WORD wVersionRequested; 10 WSADATA wsaData; 11 int err; 12 wVersionRequested = MAKEWORD( 1, 1 ); 13 err = WSAStartup( wVersionRequested, &wsaData );//初始化 14 if ( err != 0 ) 15 { 16 return; 17 } 18 if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) 19 { 20 WSACleanup( ); 21 return; 22 } 23 SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);//創建套接字 24 SOCKADDR_IN addrSrv; 25 addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//"49.152.49.84"); 26 addrSrv.sin_family = AF_INET; 27 addrSrv.sin_port = htons(6000); 28 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//鏈接到目的主機 29 char recvBuf[100],sendBuf[100]; 30 while (true) 31 { 32 33 recv(sockClient,recvBuf,100,0); 34 cout<<"對方說:"; 35 printf("%s\n",recvBuf); 36 memset(recvBuf,0,100); 37 cout<<"我說:"; 38 cin>>sendBuf; 39 send(sockClient,sendBuf,strlen(sendBuf)+1,0); 40 } 41 42 closesocket(sockClient);//關閉套接字 43 WSACleanup(); 44 }
整理以上,供參考。spa