1. 字節(jié)序
創(chuàng)新互聯(lián)-專業(yè)網站定制、快速模板網站建設、高性價比登封網站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式登封網站制作公司更省心,省錢,快速模板網站建設找我們,業(yè)務覆蓋登封地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。
網絡協(xié)議使用‘大端字節(jié)序’(起始地址存的高序字節(jié))來傳送這些多字節(jié)整數(shù)。
#include
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. 點分十進制的ASCII碼字符串和32位的網絡字節(jié)序二進制值間轉換IPv4地址
[//下面兩個函數(shù)淘汰,寫出來幫忙過渡記憶
#include
//字符串符串有效則返回1,否則0
// 不足:出錯時addrptr返回 INADDR_NONE(32位1),又有手冊稱返回-1
int inet_aton(const char *strptr, struct in_addr *addrptr);
char* inet_ntoa(struct in_addr inaddr);// 不足:不可重入
]
// 優(yōu)點:ipv4和ipv6都適合
// p:presentation n:numeric
#include
// 注意:成功返回1,輸入格式無效返回0,出錯返回-1;EAFNOSUPPORT
int inet_pton(int family, const char *strptr, void *addrptr);
// 成功返回指向結果的指針,出錯返回NULL; ENOSPC
const char* inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
3. socket
#include
int socket(int family, int type, int protocol);
int connect(int sockfd, const struct sockaddr* servaddr, socklen_t addrlen);
//bind可以指定IP地址或端口,或兩者都指定,或兩者都不指定。
//bind系統(tǒng)保留端口,需要root權限
int bind(int sockfd, const struct sockaddr* myaddr, socklen_t addrlen);
//返回套接字關聯(lián)的本地協(xié)議地址
int getsockname(int sockfd, struct sockaddr* localaddr, socklen_t *addrlen);
//返回套接字關聯(lián)的遠程協(xié)議地址 如accept返回的客戶sockfd的對應地址
int getpeername(itn sockfd, struct sockaddr* peeraddr, socklen_t addrlen);
int listen(int sockfd, int backlog);// 還是不明白backlog指定為什么樣的值比較好?
監(jiān)聽套接字維護兩個隊列:未完成連接隊列(SYN_RCVD)和已完成連接隊列(ESTABLISHED)。
int accept(int listenfd, struct sockaddr* cliaddr, socklen_t *addrlen);
4. 建立連接后
#include
int close(int sockfd);
/*
fork調用一次,返回兩次:調用進程返回子進程ID號,子進程返回0
fork的兩個用法:一是進程創(chuàng)建自身的一個副本;二是一個進程想要執(zhí)行另一個程序,副本調用 exec把自身替換成新的程序。
*/
pid_t fork(void);
pid_t getppid(void);//獲得父進程ID