基於win32的socket編程及程序實現

初步研究了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 }
View Code

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

整理以上,供參考。spa

相關文章
相關標籤/搜索