C++ socket編程

概要:

sockets(套接字)編程有三種,流式套接字(SOCK_STREAM),數據報套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基於TCP的socket編程是採用的流式套接字。

服務器端編程的步驟:

1:加載套接字庫,創建套接字(WSAStartup()/socket());

2:綁定套接字到一個IP地址和一個端口上(bind());

3:將套接字設置爲監聽模式等待連接請求(listen());

4:請求到來後,接受連接請求,返回一個新的對應於此次連接的套接字(accept());

5:用返回的套接字和客戶端進行通信(send()/recv());

6:返回,等待另一連接請求;

7:關閉套接字,關閉加載的套接字庫(closesocket()/WSACleanup())。

客戶端編程的步驟:

1:加載套接字庫,創建套接字(WSAStartup()/socket());

2:向服務器發出連接請求(connect());

3:和服務器端進行通信(send()/recv());

4:關閉套接字,關閉加載的套接字庫(closesocket()/WSACleanup())。

結構圖
這裏寫圖片描述

第一式: 加載/釋放Winsock庫:

1.加載方法:

WSADATA wsa;
/*初始化socket資源*/
if (WSAStartup(MAKEWORD(1,1),&wsa) != 0)
{
    return;   //代表失敗
}

    2.釋放方法:

    WSACleanup();

      第二式: 構造SOCKET:

      1.服務端:構造監聽SOCKET,流式SOCKET.

      SOCKET Listen_Sock = socket(AF_INET, SOCK_STREAM, 0)

        2.客戶端:構造通訊SOCKET,流式SOCKET.

        SOCKET Client_Sock = socket(AF_INET, SOCK_STREAM, 0)

          第三式:配置監聽地址和端口:

          1.服務端: SOCKADDR_IN serverAddr

          ZeroMemory((char *)&serverAddr,sizeof(serverAddr));
             serverAddr.sin_family = AF_INET;
             serverAddr.sin_port = htons(1234);           /*本地監聽端口:1234*/
             serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); /*有IP*/

            第四式: 綁定SOCKET:

            1.服務端:綁定監聽SOCKET.

              bind(Listen_Sock,(struct sockaddr *)&serverAddr,sizeof(serverAddr))

              第五式: 服務端/客戶端連接:

              1.服務端:等待客戶端接入.

                 SOCKET Command_Sock = accept(Listen_Sock, ...)

                2.客戶端:請求與服務端連接.

                int ret = connect(Client_Sock, ...)

                  第六式: 收/發數據:

                  1.服務端:等待客戶端接入.char buf[1024].
                  接收數據: recv(Command_Sock,buf, ...)

                  發送數據: send(Command_Sock,buf, ...)

                  2.客戶端:請求與服務端連接. char buf[1024].
                  發送數據: send(Client_Sock,buf, ...)

                  接收數據: recv(Client_Sock,buf, ...)

                  第七式: 關閉SOCKET:

                  1.服務端:關閉SOCKET.

                     closesocket(Listen_Sock)
                  closesocket(Command_Sock)

                    2.客戶端:關閉SOCKET.

                    closesocket(Client_Sock)

                      服務器端

                      #include <stdio.h>
                      #include <Winsock2.h>
                      #pragma comment(lib, "WS2_32")  // 鏈接到WS2_32.lib
                      void main()
                      {
                       WORD wVersionRequested;
                       WSADATA wsaData;
                       int err;
                      
                       wVersionRequested = MAKEWORD( 1, 1 );
                      
                       err = WSAStartup( wVersionRequested, &wsaData );
                       if ( err != 0 ) {
                        return;
                       }
                      
                       if ( LOBYTE( wsaData.wVersion ) != 1 ||
                              HIBYTE( wsaData.wVersion ) != 1 ) {
                        WSACleanup( );
                        return;
                       }
                       SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
                      
                       SOCKADDR_IN addrSrv;
                       addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
                       addrSrv.sin_family=AF_INET;
                       addrSrv.sin_port=htons(6000);
                      
                       bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
                      
                       listen(sockSrv,5);
                      
                       SOCKADDR_IN addrClient;
                       int len=sizeof(SOCKADDR);
                       while(1)
                       {
                        SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
                        char sendBuf[50];
                        sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));
                        send(sockConn,sendBuf,strlen(sendBuf)+1,0);
                        char recvBuf[50];
                        recv(sockConn,recvBuf,50,0);
                        printf("%s\n",recvBuf);
                        closesocket(sockConn);
                       }
                      }
                      

                      客戶端

                      #include <stdio.h>
                      #include <Winsock2.h>
                      #pragma comment(lib, "WS2_32")  // 鏈接到WS2_32.lib
                      void main()
                      {
                       WORD wVersionRequested;
                       WSADATA wsaData;
                       int err;
                      
                       wVersionRequested = MAKEWORD( 1, 1 );
                      
                       err = WSAStartup( wVersionRequested, &wsaData );
                       if ( err != 0 ) {
                        return;
                       }
                      
                       if ( LOBYTE( wsaData.wVersion ) != 1 ||
                              HIBYTE( wsaData.wVersion ) != 1 ) {
                        WSACleanup( );
                        return;
                       }
                       SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
                      
                       SOCKADDR_IN addrSrv;
                       addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
                       addrSrv.sin_family=AF_INET;
                       addrSrv.sin_port=htons(6000);
                       connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
                       send(sockClient,"hello",strlen("hello")+1,0);
                       char recvBuf[50];
                       recv(sockClient,recvBuf,50,0);
                       printf("%s\n",recvBuf);
                      
                       closesocket(sockClient);
                       WSACleanup();
                      }
                      
                      

                      轉自:http://www.cnblogs.com/Sniper-quay/archive/2011/06/22/2086636.html
                      http://www.cnblogs.com/xudong-bupt/p/3483059.html

                      發佈了5 篇原創文章 · 獲贊 2 · 訪問量 1萬+
                      發表評論
                      所有評論
                      還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
                      相關文章