天天看點

c++ 網絡程式設計基礎

c++ 網絡程式設計

标簽(空格分隔): c++

目錄

    • 建立socket
    • 綁定socket
    • 建立連接配接
    • 監聽
    • 伺服器端接收
    • 資料發送和接收
      • 面向連接配接的資料發送
      • 面向連接配接的資料接收
      • 無連接配接的資料發送
      • 無連接配接的資料接收
    • 關閉socket

int socket(int domain,int type ,int protocol);

  • domain 通常為PF_INET,表示網際網路協定(TCP/IP)
  • type 指定了Socket的類型 SOCK_STREAM(TCP),SOCK_DGRAM(UDP)
  • protocol 通常指派為0

int bind(int scokfd,struct sockaddr *MyAddr,int AddrLen);

  • scokfd Socket()函數傳回的Socket套接字
  • MyAddrr 指向含有本機IP位址及端口号的sockaddr類型的指針
    • sockaddr
    struct sockaddr{
        unsigned short as_family;//位址族,AF_xxx 
        char sa_data[14]; //14位元組的協定位址
    }
               
    * **sa_family** 一般為*AF_INET*,代表TCP/IP
      * **sa_data** 包含socket的IP位址和端口号
               
    • sockaddr_in 這個結構更加通用,與socketaddr結構體類似,且他們的指針可以互相替代
    struct sockaddr_in{
            short int sin_family;//位址族
            unsignedshort int sin_port;//端口号
            struct in_addr sin_addr;//IP位址
            unsigned char sin_zero[8];//填充0,以與 struct sockaddr大小保持一緻
        }
               
    * **sin_family** 必須設定為*AF_INET*
      * **sin_port** 端口号
      * **sin_addr** 一個unsigned long的IP位址
      * **sin)zero** 填充0,用于與sockaddr大小保持一緻
               

注意sin_port和sin_addr需要轉換成網絡位元組優先順序

面向連接配接的用戶端程式可以使用Connect函數來配置Socket,進而與遠端伺服器建立一個TCP連接配接,其函數原型為:

int connect(int sockfd, stuct sockaddr *serv_addr ,int addrlen);

  • sockfd socket()函數傳回的socket套接字
  • serv_addr 包含遠端主機的IP位址和端口号的指針
  • addrlen 遠端位址結構的長度
  • 當連接配接失敗時,傳回-1,并且設定錯誤資訊

伺服器端程式調用listern()函數使得socket處于一個别動監聽的模式,并且為這個socket建立一個輸入資料隊列,将到達伺服器的請求儲存到此隊列中,直到程式處理。

int listen(int sockfd, int backlog);

  • sockfd 調用socket()函數傳回的socket套接字
  • backlog 指定在請求隊列中允許的最大請求數
  • 緩存隊列中的請求,等待accept處理

建立好緩存隊列後,伺服器端程式可以調用accept()函數處理客戶的連接配接請求。

int accept(int sockfd, void *addr, int *addrlen);

  • sockfd 被監聽的socket套接字
  • addr 通常是一個指向sockaddr_in變量的指針,該變量用于存儲提出連接配接請求的主機資訊
  • addrlen 通常是一個指向值為

    sizeof(struct sockaddr_in)

    的整型指針變量

int send(int sockfd, const void *msg, int len, int flags);

  • sockfd 監聽的套接字
  • msg 指向要發送的資料
  • len 以位元組為機關的資料長度
  • flags 一般設定為0
  • 傳回值為實際發送出去的位元組數

int recv(int sockfd, void *buf, int len, int flags);

  • buf 存放接收資料的緩沖區
  • 傳回值為實際接收到的資料

int sendto(int sockfd, const void msg, int len, int flags, const struct sockaddr to, int tolen);

這個函數比send()函數多了兩個參數

  • to 要發送資料到的目的主機的IP位址和端口号資訊
  • tolen 通常别指派為

    sizeof(struct sockaddr)

  • from 是一個struct sockaddr類型的變量,儲存資料來源主機的IP位址和端口号
  • fromlen 一般設定為

    sizeof(stuct sockaddr)

    • 0:不允許繼續接收資料
    • 1:不允許接續發送資料
    • 2:不允許繼續發送和接收資料