首頁

2013年8月7日 星期三

*系統*Linux socket~網絡編程最常使用的函數合集~**

**系統**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        **

*
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

沒有留言:

張貼留言


if you like make fds, wellcome you here~~anytime***

my free place for everyones who want the good software,

come & download them~ wellcome!!