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_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);
- 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:不允許繼續發送和接收數據