国产成人毛片视频|星空传媒久草视频|欧美激情草久视频|久久久久女女|久操超碰在线播放|亚洲强奸一区二区|五月天丁香社区在线|色婷婷成人丁香网|午夜欧美6666|纯肉无码91视频

網(wǎng)絡(luò)編程

1、socket 函數(shù):為了執(zhí)行網(wǎng)絡(luò)輸入輸出,一個進(jìn)程必須做的第一件事就是調(diào)用socket 函數(shù)獲得一個文件描述符。#includeint socket(int family, int type, i

1、socket 函數(shù):為了執(zhí)行網(wǎng)絡(luò)輸入輸出,一個進(jìn)程必須做的第一件事就是調(diào)用socket 函數(shù)獲得一個文件描述符。

#include

int socket(int family, int type, int protocol);//成功返回非負(fù)描述字;失敗返回-1

第一個參數(shù)指明了協(xié)議簇,目前支持5種協(xié)議簇,最常用的有AF_INET(IPv4協(xié)議) 和A F_INET6(IPv6協(xié)議) ;第二個參數(shù)指明 套接口類型,有三種類型可選:SOCK_STrEAM(字節(jié)流套接口) 、SOCK_DGrAM(數(shù)據(jù)報套接口) 和SOCK_rAW(原始套接口) ;如果套 接口類型不是原始套接口,那么第三個參數(shù)就為0。

2、connect 函數(shù):當(dāng)用socket 建立了套接口后,可以調(diào)用connect 為這個套接字指明遠(yuǎn)程端的地址;如果是字節(jié)流套接口,connect 就使用三次握手建立一個連接;如果是數(shù)據(jù)報套接口,connect 僅指明遠(yuǎn)程端地址,而不向它發(fā)送任何數(shù)據(jù)。

int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); //成功返回0;失敗返回-1

第一個參數(shù)是socket 函數(shù)返回的套接口描述字;第二和第三個參數(shù)分別是一個指向套接口地址結(jié)構(gòu)的指針和該結(jié)構(gòu)的大小。

這些地址結(jié)構(gòu)的名字均已“sockaddr_”開頭,并以對應(yīng)每個協(xié)議族的唯一后綴結(jié)束。以I Pv4套接口地址結(jié)構(gòu)為例,它以“sockaddr_in”命名,定義在頭文件;以下是結(jié)構(gòu)體的內(nèi)容:

struct in_addr {

in_addr_t s_addr; //IPV4地址

};

struct sockaddr_in {

uint8_t sin_len;//無符號的8位整數(shù)

sa_family_t sin_family;//套接口地址結(jié)構(gòu)地址族,這里為AF_INET

in_port_t sin_port;//TCP或UDP 端口

struct in_addr sin_addr;//地址

char sin_zero[8];

};

3、bind 函數(shù):為套接口分配一個本地IP 和協(xié)議端口,對于網(wǎng)際協(xié)議,協(xié)議地址是32位IPv4地址或128位IPv6地址與16位的 TCP 或UDP 端口號的組合;如指定端口為0,調(diào)用bind 時內(nèi)核將選擇一個臨時端口,如果指定一個通配IP 地址,則要等到建立連接后內(nèi)核才選擇一個本地 IP 地址。

int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);//成功0失敗-1 第一個參數(shù)是socket 函數(shù)返回的套接口描述字;第二和第第三個參數(shù)分別是一個指向特定于協(xié)議的地址結(jié)構(gòu)的指針和該地址結(jié)構(gòu)的長度。

4、listen 函數(shù):listen 函數(shù)僅被TCP 服務(wù)器調(diào)用,它的作用是將用sock 創(chuàng)建的主動套接口轉(zhuǎn)換成被動套接口,并等待來自客戶端的連接請求。

int listen(int sockfd, int backlog);//成功返回0;失敗-1

第一個參數(shù)是socket 函數(shù)返回的套接口描述字;第二個參數(shù)規(guī)定了內(nèi)核為此套接口排隊的最大連接個數(shù)。由于listen 函數(shù)第二個參數(shù)的原 因,內(nèi)核要維護(hù)兩個隊列:以完成連接隊列和未完成連接隊列。未完成隊列中存放的是TCP 連接的三路握手為完成的連接,accept

,

函數(shù)是從以連接隊列中取 連接返回給進(jìn)程;當(dāng)以連接隊列為空時,進(jìn)程將進(jìn)入睡眠狀態(tài)。 5、accept 函數(shù):accept 函數(shù)由TCP 服務(wù)器調(diào)用,從已完成連接隊列頭返回一個已完成連接,如果完成連接隊列為空,則進(jìn)程進(jìn)入睡眠狀態(tài)。

int accept(int sockfd,struct sockaddr * cliaddr,socklen_t * addrlen);

// 返回:非負(fù)描述字---成功 -1---失敗

第一個參數(shù)是socket 函數(shù)返回的套接口描述字;第二個和第三個參數(shù)分別是一個指向連接方的套接口地址結(jié)構(gòu)和該地址結(jié)構(gòu)的長度;該函數(shù)返回的是一個全新的套接口描述字;如果對客戶段的信息不感興趣,可以將第二和第三個參數(shù)置為空。

6、inet_pton函數(shù):將點分十進(jìn)制串轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序二進(jìn)制值,此函數(shù)對IPv4地址和IPv6地址都能處理。

int inet_pton(int family,const char * strptr,void * addrptr);

//返回:1---成功 0---輸入不是有效的表達(dá)格式 -1---失敗

第一個參數(shù)可以是AF_INET或AF_INET6:第二個參數(shù)是一個指向點分十進(jìn)制串的指針:第三個參數(shù)是一個指向轉(zhuǎn)換后的網(wǎng)絡(luò)字節(jié)序的二進(jìn)制值的指針。

7、inet_ntop函數(shù):和inet_pton函數(shù)正好相反,inet_ntop函數(shù)是將網(wǎng)絡(luò)字節(jié)序二進(jìn)制值轉(zhuǎn)換成點分十進(jìn)制串。

const char * inet_ntop(int family,const void *addrptr,char * strptr,size_t len); //返回:指向結(jié)果的指針---成功 NULL ---失敗

第一個參數(shù)可以是AF_INET或AF_INET6:第二個參數(shù)是一個指向網(wǎng)絡(luò)字節(jié)序的二進(jìn)制值的指針;第三個參數(shù)是一個指向轉(zhuǎn)換后的點分十進(jìn)制串的指針;第四個參數(shù)是目標(biāo)的大小,以免函數(shù)溢出其調(diào)用者的緩沖區(qū)。

8. int send(int sockfd, const void *msg, int len, int flags);

Sockfd 是你想用來傳輸數(shù)據(jù)的socket 描述符,msg 是一個指向要發(fā)送數(shù)據(jù)的指針。 Len 是以字節(jié)為單位的數(shù)據(jù)的長度。flags 一般情況下置為0(關(guān)于該參數(shù)的用法可參照man 手冊)。

char *msg = "Beej was here!"; int len , bytes_sent; ... ...

len = strlen(msg); bytes_sent = send(sockfd, msg,len,0); ... ...

send()函數(shù)返回實際上發(fā)送出的字節(jié)數(shù),可能會少于你希望發(fā)送的數(shù)據(jù)。所以需要對s end()的返回值進(jìn)行測量。當(dāng)send()返回值與len 不匹配時,應(yīng)該對這種情況進(jìn)行處理。

9.int recv(int sockfd,void *buf,int len,unsigned int flags);

Sockfd 是接受數(shù)據(jù)的socket 描述符;buf 是存放接收數(shù)據(jù)的緩沖區(qū);len 是緩沖的長度。Flags 也被置為0。Recv()返回實際上接收的字節(jié)數(shù),或當(dāng)出現(xiàn)錯誤時,返回-1并置相應(yīng)的errno 值。

10. int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sock addr *to, int tolen);

該函數(shù)比send()函數(shù)多了兩個參數(shù),to 表示目地機(jī)的IP 地址和端口號信息,而tolen 常常被賦值為sizeof (struct sockaddr) 。Sendto 函數(shù)也返回實際發(fā)送的數(shù)據(jù)字節(jié)長度或在出現(xiàn)發(fā)送錯誤時返回-1。

11. int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen);

from 是一個struct sockaddr 類型的變量,該變量保存源機(jī)的IP 地址及端口號。from

,

len 常置為sizeof(struct sockaddr) 。當(dāng)recvfrom()返回時,fromlen 包含實際存入from 中的數(shù)據(jù)字節(jié)數(shù)。Recvfrom()函數(shù)返回接收到的字節(jié)數(shù)或 當(dāng)出現(xiàn)錯誤時返回-1,并置相應(yīng)的errno 。

應(yīng)注意的一點是,當(dāng)你對于數(shù)據(jù)報socket 調(diào)用了connect()函數(shù)時,你也可以利用sen d()和recv()進(jìn)行數(shù)據(jù)傳輸,但該socket 仍然是數(shù)據(jù)報socket ,并且利用傳輸層的UDP 服務(wù)。但在發(fā)送或接收數(shù)據(jù)報時,內(nèi)核會自動為之加上目地和源地址信息。

12. struct hostent *gethostbyname(const char *name); //實現(xiàn)域名和IP 的轉(zhuǎn)換 函數(shù)返回一種名為hosten 的結(jié)構(gòu)類型,它的定義如下:

struct hostent { char *h_name; /* 主機(jī)的官方域名 */ char **h_aliases; /* 一個以NULL 結(jié)尾的主機(jī)別名數(shù)組 */ int h_addrtype; /* 返回的地址類型,在Internet 環(huán)境下為AF-INET */ int h_length; /*地址的字節(jié)長度 */ char **h_addr_list; /* 一個以0結(jié)尾的數(shù)組,包含該主機(jī)的所有地址*/

};

13. int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen) int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)

level 指定控制套接字的層次. 可以取三種值: 1)SOL_SOCKET:通用套接字選項. 2)IPPROTO _IP:IP選項. 3)IPPROTO_TCP:TCP選項.

optname 指定控制的方式(選項的名稱), 我們下面詳細(xì)解釋

optval 獲得或者是設(shè)置套接字選項. 根據(jù)選項名稱的數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換

選項名稱 說明 數(shù)據(jù)類型

========================================================================

SOL_SOCKET

------------------------------------------------------------------------

SO_BROADCAST 允許發(fā)送廣播數(shù)據(jù) int

SO_DEBUG 允許調(diào)試 int

SO_DONTROUTE 不查找路由 int

SO_ERROR 獲得套接字錯誤 int

SO_KEEPALIVE 保持連接 int

SO_LINGER 延遲關(guān)閉連接 struct linger

SO_OOBINLINE 帶外數(shù)據(jù)放入正常數(shù)據(jù)流 int

SO_RCVBUF 接收緩沖區(qū)大小 int

SO_SNDBUF 發(fā)送緩沖區(qū)大小 int

SO_RCVLOWAT 接收緩沖區(qū)下限 int

SO_SNDLOWAT 發(fā)送緩沖區(qū)下限 int

SO_RCVTIMEO 接收超時 struct timeval

SO_SNDTIMEO 發(fā)送超時 struct timeval

,

SO_REUSERADDR 允許重用本地地址和端口 int

SO_TYPE 獲得套接字類型 int

SO_BSDCOMPAT 與BSD 系統(tǒng)兼容 int

======================================================================

IPPROTO_IP

--------------------------------------------------------------------------

IP_HDRINCL 在數(shù)據(jù)包中包含IP 首部 int

IP_OPTINOS IP 首部選項 int

IP_TOS 服務(wù)類型

IP_TTL 生存時間 int

======================================================================

IPPRO_TCP

--------------------------------------------------------------------------

TCP_MAXSEG TCP 最大數(shù)據(jù)段的大小 int

TCP_NODELAY 不使用Nagle 算法 int

======================================================================

關(guān)于這些選項的詳細(xì)情況請查看 Linux Programmer''s Manual

14. TCP 客戶端的過程

socket()->[*對所要連接的server 對應(yīng)的sockaddr_in結(jié)構(gòu)中的sin_family,sin_addr.s_addr,sin_port賦值*]->connect()-> { write()->read()-> } close()

TCP 服務(wù)端的過程

socket()->[*對server 所對應(yīng)的sockaddr_in機(jī)構(gòu)中的sin_family,sin_addr.s_addr,sin_port進(jìn)行賦值*]->bind()->listen()->{ accept()-> read()->write()-> }close()

15.UDP 客戶的過程

[*對所要連接的server 對應(yīng)的sockaddr_in結(jié)構(gòu)中的sin_family,sin_addr.s_addr, sin_port賦值*]->socket()->{ sendto()->recvfrom()-> } close()

UDP 服務(wù)端的過程

socket()->[對server 對應(yīng)的sockaddr_in結(jié)構(gòu)中的sin_family,sin_addr.s_addr, sin_port賦值] –>bind()->{ recvfrom()->sendto()-> }close()

標(biāo)簽: