c++ 網絡編程基礎


c++ 網絡編程

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


建立socket

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

  • domain 通常為PF_INET,表示互聯網協議(TCP/IP)
  • type 指定了Socket的類型 SOCK_STREAM(TCP),SOCK_DGRAM(UDP)
  • protocol 通常賦值為0

綁定socket

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_portsin_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);

  • sockfd 監聽的套接字
  • buf 存放接收數據的緩沖區
  • len 以字節為單位的數據長度
  • flags 一般設置為0
  • 返回值為實際接收到的數據

無連接的數據發送

int sendto(int sockfd, const void msg, int len, int flags, const struct sockaddr to, int tolen);
這個函數比
send()
函數多了兩個參數

  • to 要發送數據到的目的主機的IP地址和端口號信息
  • tolen 通常別賦值為sizeof(struct sockaddr)
  • 返回值為實際發送出去的字節數

無連接的數據接收

int recvfrom(int sockfd, void *buf, int len, int flag, struct sockaddr from, int fromlen);
這個函數比
recv()
函數多了幾個參數

  • from 是一個struct sockaddr類型的變量,保存數據來源主機的IP地址和端口號
  • fromlen 一般設置為sizeof(stuct sockaddr)
  • 返回值為實際接收到的數據

關閉socket

  • 停止socket上面的全部操作
    closesocket(sockfd);

  • 關閉socket上面的某一個操作
    int shutdown(int sockfd, int how);
    how有幾個可選的值

    • 0:不允許繼續接收數據
    • 1:不允許接續發送數據
    • 2:不允許繼續發送和接收數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM