C++ 利用socket實現TCP,UDP網絡通信

       學習孫鑫老師的vc++深刻淺出,有一段時間了,第一次接觸socket說實話有點兒看不懂,第一次基本上是看他說一句我寫一句完成的,第二次在看SOCKET多少有點兒感受了,接下來我把利用SOCKET完成TCP和UDP兩種通信模式的流程和代碼分享一下,但願對你們多少能有點兒幫助,有什麼說的不對的歡迎各位大神指正。c++

   TCP服務器

      TCP是點對點的通信模式,數據傳輸質量高,對於傳輸數據完整性要求高的狀況通常用TCP,具體到vc++中,通常選用的是服務器/客戶端模式,socket實現TCP通信在服務器端通常分爲如下幾步:socket

服務器端函數

      1.加載套接字庫,加載套接字庫的代碼通常是固定的每次複製如下就OK。學習

      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)
   {spa

    WSACleanup();
     return;
   }io

    2.建立套接字變量

    SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
    SOCKADDR_IN sockaddr;//建立一個地址結構體,對它的變量進行設置
    sockaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    sockaddr.sin_family=AF_INET;
    sockaddr.sin_port=htons(6000);
cli

    3.將套接字和IP地址和端口鏈接服務器端

    bind(sockSrv,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));//綁定

    4.將套接字設置爲監聽模式

    listen(sockSrv,5);//設置爲監聽模式

    5.建立連接套接字

    SOCKADDR_IN sockclient;
    int len=sizeof(SOCKADDR);
    SOCKET sockCon=accept(sockSrv,(SOCKADDR*)&sockclient,&len);//建立連接套接字

    6.發送和接收數據給客戶端

    char sendBuf[100];

    send(sockCon,sendBuf,strlen(sendBuf)+1,0);
    char recvBuf[100];
    recv(sockCon,recvBuf,100,0);//發送\接收函數

    7.關閉套接字

    closesocket(sockCon);//關閉套接字

客戶端

    1.加載套接字庫

    與服務器端代碼同樣,直接複製就能夠

    2.建立套接字

    SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
    SOCKADDR_IN sockaddr;
    sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    sockaddr.sin_family=AF_INET;
    sockaddr.sin_port=htons(6000);

    3.套接字和IP地址和端口鏈接

    connect(sockClient,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));

    4.發送接收數據給服務器

    char recvBuf[100];
    recv(sockClient,recvBuf,100,0);
    printf("%s\n",recvBuf);
    send(sockClient,"服務器你好",strlen("服務器你好")+1,0);

    5.關閉套接字

    closesocket(sockClient);
    WSACleanup();

別忘了加上頭文件#include<winsock2.h>同時要在link一下ws2_32.lib.而後就OK了。

UDP

udp是面向無鏈接的,廣播式的數據傳輸機制,它的實時性高,輸出傳輸的完整性無法保證,對於一些實時性要求高,完整性要求不高的狀況採用UDP。

服務器端

1.加載套接字庫

 啥也不說了,直接複製

2.建立udp套接字

   SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);//這裏主要與TCP模式下該參數的區別
   SOCKADDR_IN sockaddr;//建立一個地址結構體,對它的變量進行設置
   sockaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
   sockaddr.sin_family=AF_INET;
   sockaddr.sin_port=htons(6000);

3.將套接字和IP地址和端口綁定

   bind(sockSrv,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));//綁定

4.接收數據

這裏的接收函數用的是recvfrom();

5.關閉套接字

   closesocket(sock);

客戶端

1.加載套接字庫

 

 啥也不說了,直接複製

 

2.建立UDP套接字

    SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
    SOCKADDR_IN sockaddr;
    sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    sockaddr.sin_family=AF_INET;
    sockaddr.sin_port=htons(6000);

3.發送數據

   sendto();//發送函數也有區別的

4.關閉套接字

  closesocket(sockClient);
  WSACleanup();

別忘了加上頭文件#include<winsock2.h>同時要在link一下ws2_32.lib.而後就OK了。

相關文章
相關標籤/搜索