liunx網絡編程-socket(函數)

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 失敗
  • 大於0 socket描述符

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返回

  • 0 成功
  • SOCKET_ERROR 失敗

1.3監聽

  • 只是設置監聽上限,並不阻塞接聽
int listen(int sockfd, int backlog)

1.3.1參數

No. 參數 含義
1 sockfd 監聽的socket描述符
2 backlog 排隊的最大連接個數

1.3.2返回值

  • 0 成功
  • -1 失敗

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 連接描述符
  • -1 失敗

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返回值

  • 0 成功
  • -1 失敗

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狀態的屬性
  • IPPROTO_IP級別
No. 參數 含義
1 IP_ADD_MEMBERSHIP 加入指定的組播組。
2 IP_DROP_MEMBERSHIP 離開指定的組播組。
3 IP_MULTICAST_IF 指定發送組播數據的IP地址。
4 IP_MULTICAST_LOOP 發送組播數據的主機是否作爲接收組播數據的組播成員。

1.7.2返回值

  • 0 成功
  • -1 失敗

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返回值

  • 0 成功
  • -1 失敗

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 連接的讀和寫都關閉
  • 返回值
    • 成功 0
    • 失敗 -1

    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 出錯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章