函數 | 說明 | 成功 | 失敗 |
---|---|---|---|
建立套接字 | |||
socket | 建立一個套接字 | 文件(套接字)描述父 | -1 |
getsockename | 獲取套接字的綁定地址 | 0 | -1 |
getpeername | 獲取對方的地址 | 0 | -1 |
shudown | 禁用一個套接字的I/O的讀寫功能 | 0 | -1 |
htonl、htons | 機器字節序和網絡字節序之間實現轉換 | 以網絡字節序表示的32/16位整數 | -1 |
inet_ntop、inet_pton | 網絡字節順序的地址轉換(二進制<---->文本字符串格式) | 地址字符串指針/格式無效 | -1 |
網絡地址信息 | |||
gethostent | 查詢網絡地址信息 | 指針 | NULL |
sethostent | 會打開文件,若是文件被打開,將其迴繞 | ||
endhostent | 關閉文件 | ||
getprotobyname | 協議名稱和協議號之間映射 | 指針 | NULL |
getprotobynumber | |||
getproto | |||
getservbyname | 服務器名和端口 | 指針 | NULL |
getservbyport | |||
getservbynet | |||
getaddrinfo | 將一個主機名和一個服務器名的關係映射到一個地址空間 | 0 | 非0錯誤碼 |
freeaddrinfo | 釋放緩衝空間 | ||
get_strerror | 將getaddrinfo失敗的錯誤碼轉換成錯誤消息 | 指向描述錯誤的字符串的指針 | |
getnameinfo | 套接字地址(addr)被翻譯成一個主機名和一個服務器名映射到一個地址 | 0 | 非0錯誤碼 |
服務器 | |||
bind | 關聯服務器地址和套接字 | 0 | -1 |
listen | 監聽 | 0 | -1 |
accept | 阻塞直到得到客戶端請求並創建鏈接 | 文件(套接字)描述符,參數中地址獲取客戶端地址 | -1 |
客戶端 | |||
connect | 鏈接服務器地址 | 0 | -1 |
數據傳輸 | |||
send | 發送 | 放回發送的字節數 | -1 |
sendto | sendto能夠在無鏈接的套接字上指定一個目標地址 | 放回發送的字節數 | -1 |
sendmsg | 調用帶有msghdr結構的sengmsg來指定多重緩衝區數據,和writev函數類似 | 放回發送的字節數 | -1 |
recv | 接受 | 返回數據的字節長度;若無可用數據或對等方已經按序結束,返回0 | -1 |
recvfrom | 接受 | 返回數據的字節長度;若無可用數據或對等方已經按序結束,返回0 | -1 |
recvmsg | 從指定多重緩衝區數據接受帶有msghdr結構的sengmsg來,和readv函數類似 | 返回數據的字節長度;若無可用數據或對等方已經按序結束,返回0 | -1 |
套接字選項 | |||
setsockopt | 設置套接字選項 | 0 | -1 |
getsockopt | 獲取套接字選項 | 0 | -1 |
struct sockaddr { sa_family_t sa_family; /*地址協議:ipv四、ipv六、*// char sa_data[]; /*地址變量長度*/ ... }
// linux的地址格式 struct sockaddr_t { sa_family_t sin_family; /*地址協議:ipv四、ipv六、*/ in_port_t sin_port; /*端口號*/ struct in6_addr sin6_addr; /*IPv4 address*/ unsigned char sin_size[8]; /*filer*/ }
理想狀態下應用程序不須要了解一個套接字地址的內部結構,通常把地址信息存在:linux
#include <sys/socket.h> int socket(int domain,int type,int protocal); -- '成功:文件(套接字)描述父;出錯:-1'
參數:數據庫
域 | 描述 |
---|---|
AF_INET | IPv4因特網域 |
AF_INET6 | IPv6因特網域 |
AF_UNIX | UNIX域 |
AF_UPSPEC | 未指定 |
|類型|描述| |:--|:--| |SOCK_DGRAM|固定長度、無鏈接的、不可靠的報文傳遞(UDP)| |SOCK_RAW|IP協議的數據報接口| |SOCK_SEQPACKET|固定長度、有序的、可靠的、面向鏈接的報文傳遞| |SOCK_STREAM|有序的、可靠的、雙向的、面向鏈接的字節流(TCP)|數組
協議 | 描述 |
---|---|
IPPROTO_IP | IPv4網際協議 |
IPPROTO_IP6 | IPv6網際協議 |
IPPROTO_ICMP | 英特網控制報文協議(Internet Control Message Protocol) |
IPPROTO_RAW | 原始IP數據包協議 |
IPPROTO_TCP | 促昂數控制協議 |
IPPROTO_UDP | 用戶數據報協議(User Datagram Protocol) |
特色:服務器
#include <sys/socket.h> int shutdown(int sockfd, int how); -- '成功:0;失敗:-1'
參數:網絡
特色:架構
#include <arpa/inet.h> uint32_t htonl(uint32_t hostint32); '返回值:以網絡字節序表示的32位整數' uint16_t htons(uint16_t hostint16); '返回值:以網絡字節序表示的16位整數' uint32_t ntonl(uint32_t hostint32); '返回值:以主機字節序表示的32位整數' uint16_t ntons(uint16_t hostint16); '返回值:以主機字節序表示的16位整數'
#include <arpa/inet.h> const char *inet_ntop(int domain, const void *restrict addr, char *restrict str, socklen_t size); -- '成功:地址字符串指針;出錯:NULL' const char *inet_pton(int domain, const char *restrict str, void *restrict addr); -- '成功:1;格式無效:0;出錯:-1'
特色:dom
#include <netdb.h> struct hostent *gethostent(void); -- '成功:指針;出錯:NULL' void sethostent(int stayopen); '會打開文件,若是文件被打開,將其迴繞' void endhostent(void); '關閉文件' //hostent結構 struct hostnet { char *h_name; /* name of host*/ char **h_aliases; /* pointer to alernate host name array */ int h_addrtype; /* address type */ int h_length; /* length in bytes of address */ char **h_addr_list; /* pointer to array of network addresses */ ... }
#include <netdb.h> struct protoent *getprotobyname(const char *name); struct protoent *getprotobynumber(int proto); struct protoent *getproto(void); -- '成功:返回指針;出錯:NULL' void setprotoent(int stayopen); void endprotoent(void); struct protoent { char *p_name; /* protocol name */ char **p_aliases; /* pointer to altername protocol name array */ int p_proto; /* protocol number */ ... }
#include <netbd.h> struct servent *getservbyname(const char *name, const char *proto); struct servent *getservbyport(int port, const char *proto); struct servent *getservbynet(void); --'成功:指針;出錯:NULL' void setprotoent(int stayopen); void endprotoent(void); struct servent { char *p_name; /* protocol name */ char **p_aliases; /* pointer to altername protocol name array */ int p_port; /* port number */ int *s_proto; /* name of protocol */ ... }
特色:異步
#include <sys/socket.h> #include <netdb.h> int getaddrinfo(const char *restrict host, const char *restrict service, const struct addrinfo *restrict hint, struct addrinfo **restrict res); -- '成功:0;出錯:非0錯誤碼' void freeaddrinfo(struct addrinfo *ai); struct addrinfo { int ai_flags; /*customize behavior */ int ai_family; /* address family */ int ai_socketype; /* socket type */ int ai_protocol; /* protocol */ socklen_t ai_addrlen; /* length in bytes of address */ struct sockaddr *ai_addr; /* address */ char *ai_canonname; /* canonical name of host */ struct addrinfo *ai_next; /* next in list */ ... }
參數:socket
標誌 | 描述 |
---|---|
AI_ADDRCONFIG | 查詢配置的地址類型(IPv4或IPv6) |
AI_ALL | 查詢IPv4或IPv6地址 |
AI_CANONNAME | 須要一個規範的名字(與別名相對) |
AI_NUMERICHOST | 以數字格式指定主機地址,不翻譯 |
AI_NUMERICSERV | 以服務指定爲數字端口號,不翻譯 |
AI_PASSIVE | 套接字地址用於監聽綁定 |
AI_V4MAPPED | 若是沒有找到IPv6地址,返回映射到IPv6個數的IPv4地址 |
#include <netdb.h> const char *gai_strerror(int error); -- '指向描述錯誤的字符串的指針'
#include <sys/socket.h> #include <netdb.h> int getnameinfo(const struct sockaddr *restrict addr, socklen_t alen, char *restict host, socklen_t hostlen, char *restict service, socklen_t servlen, int flags ); -- '成功:0;出錯:非0錯誤碼'
參數:函數
標誌 | 描述 |
---|---|
NI_DGRAM | 服務基於數據報而非基於流 |
NI_NAMEREQD | 若是找不到主機名,將其做爲一個錯誤對待 |
NI_NOFQDN | 對於本地主機,僅返回全限定域名的節點名部分 |
NI_NUMERICHOST | 返回主機地址的數字形式,而非主機名 |
NI_NUMRICSCOPE | 對於IPv6,返回範圍ID的數字形式,而非名字 |
NI_NUMERICSERV | 返回服務地址的數字形式(即端口號),而非名字 |
#include <sys/socket.h> int bind(int sockfd, const struct sockaddr *addr ,socklen_t len); -- '成功:0;錯誤:-1'
參數:
#include <sys/socket.h> int getsockename(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp); -- '成功:0;出錯:-1'
參數:
#include <sys/socket.h> int getpeername(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp); -- '成功:0;出錯:-1'
參數:
#include <sys/socket.h> int connect(int sockfd, const struct sockaddr *addr, socklen_t len); -- '成功:0;出錯:-1'
參數:
#include <sys/socket.h> int listen(int sockfd, int backlog); -- '成功:0;出錯:-1'
參數:
#include <sys/socket.h> int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict len); -- '成功:文件(套接字)描述符;出錯:-1'
參數:
特色:
#include <sys/socket.h> ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags ); -- '成功:放回發送的字節數;出錯:-1'
參數:
標誌 | 描述 |
---|---|
MSG_CONFIRM | 提供鏈路層有效以保持地址映射有效 |
MSG_DONTROUTE | 勿將數據包路由出本地網絡 |
MSG_DONTWAIT | 容許非阻塞操做(等價於使用O_NONBLOCK) |
MSG_EOF | 發送數據後關閉套接字的發送端 |
MSG_EOR | 若是協議支持,標記記錄結束 |
MSG_MORE | 延遲發送數據包容許寫更多數據 |
MSG_NOSIGNAL | 寫無鏈接的套接字時不產生SIGPIPE信號 |
MSG_OOB | 若是協議支持,發送帶外數據 |
特色:
#include <sys/socket.h> ssize_t sendto(inft sockfd, const void *buf ,size_t nbytes, int flags, const struct sockaddr *destaddr, socklen_t destlen); -- '成功:發送的字節數;出錯:-1'
#include <sys/socket.h> ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags); -- '成功:發送的字節數;出錯:-1' struct iovec { iov_base; //buffer的起始位置 iov_len; //buffer的長度 } struct msghdr { void *msg_name; /*optional addrss */ socklen_t *msg_name; /* address size in bytes */ struct iovec *msg_iov; /* iovec buffer 指針*/ int msg_iovlen; /* buffer數組長度*/ void *msg_control; /* ancillary data */ socklen msg_controllen; /* number of ancillary bytes */ int *msg_flags; /* flags for reveived message */ ... }
特色:
#include <sys/socket.h> ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags); -- '成功:返回數據的字節長度;若無可用數據或對等方已經按序結束,返回0;出錯:-1'
參數:
標誌 | 描述 |
---|---|
MSG_CMSG_CLOEXEC | 爲UNIX域套接字上接受的文件描述符社會資執行時關閉標誌 |
MSG_DONTWAIT | 容許非阻塞操做(等價於使用O_NONBLOCK) |
MSG_ERRQUEUE | 接受錯誤信息做爲輔助數據 |
MSG_OOB | 若是協議支持,獲取外帶數據 |
MSG_PEEK | 返回數據包內容而不真正取走數據包 |
MSG_TRUNCL | 及時數據包唄截斷,也返回數據包的實際長度 |
MSG_WAITALL | 如等待知道直到全部的數據可用(僅SOCK_STREAM) |
#include <sys/socket.h> ssize_t recvfrom(int sockfd, void *restrict buf, size_t len, int flags, struct sockaddr *restrict addr, socklen_t *restrict addrlen); -- '成功:返回數據的字節長度;若無可用數據或對等方已經按序結束,返回0;出錯:-1'
#include <sys/socket.h> ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags); -- '成功:返回數據的字節長度;若無可用數據或對等方已經按序結束,返回0;出錯:-1'
參數:
標誌 | 描述 |
---|---|
MSG_CTRUNC | 控制數據唄截斷 |
MSG_EOR | 接受記錄結束符 |
MSG_ERRQUEUE | 接受錯誤信息做爲輔助數據 |
MSG_OOB | 若是協議支持,獲取外帶數據 |
MSG_TRUNCL | 通常數據被截斷 |
#include <sys/socket.h> int setsockopt(int sockfd, int level, int option, const void *val, socklen_t len); -- '成功:0;出錯:-1
參數:
option | 參數val的類型 | 描述 |
---|---|---|
SO_ACCEPTIONN | int | 返回信息指示該套接字是否被監聽 |
SO_BROADCAST | int | 若是*val非0;廣播數據報 |
SO_DEBUG | int | 若是*val非0;啓動過網絡驅動調試功能 |
SO_DONTROUTE | int | 若是*val非0;繞過一般路由 |
SO_ERROR | int | 返回掛起的套接字錯誤並清除 |
SO_KEEPALIVE | int | 若是*val非0;啓用週期性keep-alive報文 |
SO_LINGER | struct linger | 當還有未發報文而套接字已關閉,延遲時間 |
SO_OOBINLINE | int | 若是*val非0;將帶外數據放到普通數據中 |
SO_RCVBUF | int | 接受緩衝區的字節長度 |
SO_RCVLOWAT | int | 接受調用中返回的最小數據字節數 |
SO_RCVTIMEO | struct timeval | 套接字接受調用的超時值 |
SO_REUSEADDR | int | 若是*val非0;重用bind中的地址 |
SO_SNDBUF | int | 發送緩衝區的字節長度 |
SO_SNDLOWAT | int | 發送調用中傳送的最小數據字節數 |
SO_SNDTIMEO | struct timeval | 套接字發送調用的超時值 |
SO_TYPE | int | 標識套接字類型 |
#include <sys/socket.h> int getsockopt(int sockfd, int level, int option , void *restrict val, socklen_t *restrict lenp); -- '成功:0;出錯:-1'
#include <sys/socket.H> int sockatmark(int sockfd); --'成功:若在標記處,返回1;若妹子啊標記處,返回0;出錯:-1'