1Tcp 通信函數
1.1創建
int socket(int domain, int type, int protocol)
1.1.1參數
No. |
參數 |
含義 |
int socket(int domain, int type, int protocol) |
1 |
domain |
協議域 |
AF_INET:IPv4;AF_INET6:IPv6;AF_LOCAL:Unix域 |
2 |
type |
類型 |
SOCK_STREAM:流式套接字;SOCK_DGRAM:數據報套接字;SOCK_RAW:原始套接字 |
3 |
protocol |
協議 |
0:自動根據type匹配協議;IPPROTO_TCP/IPPROTO_UDP |
1.1.2返回值
1.2綁定
int bind(int socket, const struct sockaddr* address, socklen_t address_len)
1.2.1參數
No. |
參數 |
含義 |
1 |
socket |
套接字描述符 |
2 |
address |
服務器地址和端口號 |
3 |
address_len |
服務器address緩衝區的長度 |
1.2.2返回
1.3監聽
int listen(int sockfd, int backlog)
1.3.1參數
No. |
參數 |
含義 |
1 |
sockfd |
監聽的socket描述符 |
2 |
backlog |
排隊的最大連接個數 |
1.3.2返回值
1.4接受
- 如果不需要獲取客戶端的套接字地址,後兩個參數可設置爲NULL。
- 阻塞監聽函數
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
1.4.1參數
No. |
參數 |
含義 |
1 |
sockfd |
服務器的socket描述符,監聽socket描述符 |
2 |
addr |
傳出參數客戶端的socket地址 |
3 |
addrlen ** |
傳入傳出參數**客戶端的socket地址的長度 |
1.4.2返回值
1.5.1連接
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
1.5.1參數
No. |
參數 |
含義 |
1 |
sockfd |
客戶端的socket描述字 |
2 |
addr |
服務器的socket地址 |
3 |
addrlen |
服務器的socket地址的長度 |
1.5.2返回值
1.6接收ssize_t read(int fd, void *buf, size_t len);
1.6.1參數
No. |
參數 |
含義 |
1 |
fd |
文件描述符 |
2 |
buf |
讀取數據 |
3 |
len |
讀取數據的長度 |
1.6.2返回值
- 0 讀到文件的結束,此時讀端已經關閉
- 大於0 實際所讀的字節數
- <0 出錯
- errrno=EAGAIN or EWOULDBLOCK:設置了非阻塞方式,但是u沒有數據到達
- errno=EINTR 慢速系統調用被中斷
- errno=“其他情況” 異常
1.7 設置屬性
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen)
1.7.1參數
No. |
參數 |
含義 |
1 |
sockfd |
套接字描述符 |
2 |
level |
選項層次 |
3 |
optname |
選項 |
4 |
optval |
選項值指針 |
5 |
optlen |
optval緩衝區長度 |
1.7.1.1參數level
No. |
參數 |
含義 |
1 |
SOL_SOCKET |
通用套接字選項 |
2 |
IPPROTO_TCP |
TCP選項 |
3 |
IPPROTO_IP |
IP選項 |
4 |
IPPROTO_IPV6 |
IPv6選項 |
1.7.1.2參數optname
- 選項分爲SOL_SOCKET級別和IPPROTO_IP級別兩個級別
- SOL_SOCKET級別
No. |
參數 |
含義 |
1 |
SO_REUSEADDR |
讓端口釋放後立即就可以被再次使用。一個端口釋放後會等待兩分鐘之後才能再被使用。 |
2 \SO_RCVBUF |
接收確定緩衝區大小 |
|
3 |
SO_SNDBUF |
發送緩衝區大小 |
4 |
SO_SNDTIMEO |
發送時限 |
5 |
SO_RCVTIMEO |
接收時限 |
6 |
SO_BROADCAST |
廣播 |
7 |
SO_DONTLINGER |
關閉端口不進入TIME_WAIT狀態 |
8 |
SO_LINGER |
關閉端口進入TIME_WAIT狀態的屬性 |
No. |
參數 |
含義 |
1 |
IP_ADD_MEMBERSHIP |
加入指定的組播組。 |
2 |
IP_DROP_MEMBERSHIP |
離開指定的組播組。 |
3 |
IP_MULTICAST_IF |
指定發送組播數據的IP地址。 |
4 |
IP_MULTICAST_LOOP |
發送組播數據的主機是否作爲接收組播數據的組播成員。 |
1.7.2返回值
1.8獲取socket 屬性
int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen)
1.8.1參數
No. |
參數 |
含義 |
1 |
sockfd |
套接字描述符 |
2 |
level |
選項層次 |
3 |
optname |
選項 |
4 |
optval |
選項值指針 |
5 |
optlen |
optval緩衝區長度 |
1.8.2返回值
1.9端口複用
-
端口被佔用
-
解決方法
int flag = 1;
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&flag,sizeof(flag));
- 啓用SO_REUSEADDR選項後,bind()函數將允許地址的立即重用。
1.10關閉
1.10.1關閉int close(int sockfd)
1.10.2 半關閉int shutdown(int sockfd,int howto)
- 參數
- sockfd socket套接字
- howto 關閉方式
- SHUT_RD 0 關閉連接的讀
- SHUT_WR 1 關閉連接的寫
- SHUT_RDWR 2 連接的讀和寫都關閉
- 返回值
1.10.3區別close和shutdown
-shutdown在關閉文件描述符應用的文件時,採用的時關閉全部描述符,close只關閉一個文件描述符
2UDP通信函數
- socket() bind() 函數使用和上面相同
2.1接受recvfrom()
- 在recvfrom()函數涵蓋accept()函數傳出地址結構的作用
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen)
2.1.1參數
no |
參數 |
含義 |
1 |
fd |
文件描述符 |
2 |
buf |
緩衝區地址,讀取數據 |
3 |
len |
緩衝區大小,讀取數據的長度 |
4 |
flags |
通常爲0 |
5 |
dest_addr |
傳出參數 目標socket地址 |
6 |
addrlen |
傳入傳出參數, 目標socket地址長度 |
2.1.2返回值
No. |
返回值 |
含義 |
1 |
0 |
讀到文件的結束,對端關閉 |
2 |
>0 |
實際所讀的字節數 |
3 |
<0 |
出錯errno |
2.2發送sendto()
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
2.2.1參數
No. |
參數 |
含義 |
1 |
sockfd |
sockfd文件描述符 |
2 |
buf |
寫入數據 |
3 |
len |
寫入數據的長度 |
4 |
flags |
通常爲0 |
5 |
dest_addr |
目標socket地址 |
6 |
addrlen |
傳入參數目標socket地址長度 |
2.2.2返回值
No. |
返回值 |
含義 |
1 |
>0 |
實際所寫的字節數 |
2 |
<0 |
出錯 |