Linux socket 网络编程常用函数总结
1.字節序函數
#include?<netinet.h>
uint16_t?htons(uint16_t?host16bitvalue);
uint32_t?htonl(uint32_t?host32bitvalue);
返回:網絡字節序值
uint16_t?ntohs(uint16_t?net16bitvalue);
uint32_t?ntohl(uint32_t?net32bitvalue);
返回:主機字節序值
2.字節操作函數
?
#include?<strings.h>
void?bzero(void?*dest,?size_t?nbytes);
void?bcopy(const?void?*src,?void?*dest,?size_t?nbytes);
int?bcmp(const?void?*ptr1,?const?void?*ptr2,?size_t?nbytes);
返回:0—相等,非0—不相等
#include?<string.h>
void?*memset(void?*dest,?int?c,?size_t?len);
void?*memcpy(void?*dest,?void?*src,?size_t?nbytes);
int?memcmp(const?void?*ptr1,?const?void?*ptr2,?size_t?nbytes);
返回:0—相同,>0或<0—不相同;進行比較操作時,假定兩個不相等的字節均為無符號字符(unsigned?char)。
?
3.socket函數
?
?
#include?<sys/socket.h>
int?socket(int?family,?int?type,?int?protocol);
返回:非負描述字—成功,-1—出錯。
family指定協議族,有如下取值:
·?AF_INET?????IPv4協議?
·?AF_INET6????IPv6協議?
·?AF_LOCAL????Unix域協議?
·?AF_ROUTE????路由套接口?
·?AF_KEY??????密鑰套接口?
type指定套接口類型:
·?SOCK_STREAM????字節流套接口?
·?SOCK_DGRAM?????數據報套接口?
·?SOCK_RAW???????原始套接口?
protocol一般設為0,除非用在原始套接口上。
并非所有family和type的組合都是有效的。
AF_LOCAL等于早期的AF_UNIX。
?
4.connect函數
?
?
#include?<sys/socket.h>
int?connect(int?sockfd,?const?struct?sockaddr?*servaddr,?socklen_t?addrlen);
返回:0—成功,-1—出錯。
sockfd是socket函數返回的套接口描述字,servaddr和addrlen是指向服務器的套接口地址結構指針和結構大小。
在調用connect之前不必非得調用bind函數。
如果是TCP,則connect激發TCP的三路握手過程,在阻塞情況下,只有在連接建立成功或出錯時該函數才返回,
出錯情況:
·?沒有收到SYN分節的響應,在規定時間內經過重發仍無效,則返回ETIMEDOUT;?
·?如果對SYN分節的響應是RST,表示服務器在指定端口上沒有相應的服務,返回ECONNREFUSED;?
·?如果發出?SYN在中間路由器上引發一個目的地不可達ICMP錯誤,在規定時間內經過重發仍無效,則返回EHOSTUNREACH或ENETUNREACH錯誤。?
注意:如果connect失敗,則套接口將不能再使用,必須關閉,不能對此套接口再調用函數connect。
5.bind函數
?
?
#include?<sys/socket.h>
int?bind(int?sockfd,?const?struct?sockaddr?*maddr,?socklen_t?addrlen);
返回:0—成功,-1—出錯。
進程可以把一個特定的IP地址捆綁到他的套接口上,但此IP地址必須是主機的一個接口。
對于IPv4,通配地址是INADDR_ANY,其值一般為0;使用方法如下:
struct?sockaddr_in?servaddr;
servaddr.sin_addr.s_addr?=?htonl(INADDR_ANY);
對于IPv6,方法如下:
struct?sockaddr_in6?serv;
serv.sin6_addr?=?in6addr_any;?(系統分配變量in6addr_any并將其初始化為常值IN6ADDR_ANY_INIT。)
如果讓內核選擇臨時端口,注意的是bind并不返回所選的斷口值,要得到一個端口,必須使用getsockname函數。
bind失敗的常見錯誤是EADDRINUSE(地址已使用)。
?
6.listen函數
?
?
#include?<sys/socket.h>
int?listen(int?sockfd,?int?backlog);
返回:0—成功,-1—出錯。
listen把未連接的套接口轉化為被動套接口,指示內核應接受指向此套接口的連接請求。第二個參數規定了內核為此套接口排隊的最大連接數。
參數backlog曾經規定為監聽套接口上的未完成連接隊列和已完成連接隊列總和的最大值,但各個系統的定義方法都不盡相同;歷史上常把backlog置為5,但對于繁忙的服務器是不夠的;backlog的設置沒有一個通用的方法,依情況而定,但不要設為0。
?
7.accept函數
?
?
#include?<sys/socket.h>
int?accept(int?sockfd,?struct?sockaddr?*cliaddr,?socklen_t?*addrlen);
返回:非負描述字—OK,-1—出錯。
accept從已完成連接隊列頭返回下一個連接,若已完成連接隊列為空,則進程睡眠(套接口為阻塞方式時)。
參數cliaddr和addrlen返回連接對方的協議地址,其中addrlen是值-結果參數,調用前addrlen所指的整數值要置為cliaddr所指的套接口結構的長度,返回時由內核修改。
accept成功執行后,返回一個連接套接口描述字。
如果對客戶的協議地址沒有興趣,可以把cliaddr和addrlen置為空指針。
?
8.close函數
?
?
#include?<unistd.h>
int?close(int?sockfd);
返回:0—OK,-1—出錯。
TCP套接口的close缺省功能是將套接口做上“已關閉”標記,并立即返回到進程。這個套接口描述字不能再為進程使用,但TCP將試著發送已排隊待發的任何數據,然后按正常的TCP連接終止序列進行操作。
close把描述字的訪問計數減1,當訪問計數仍大于0時,close并不會引發TCP的四分組連接終止序列。若確實要發一個FIN,可以用函數shutdown。
總結
以上是生活随笔為你收集整理的Linux socket 网络编程常用函数总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux挂载点的容量设置
- 下一篇: [转载] 七龙珠第一部——第091话 克