九九热这里直有精品,1区二区三区在线播放,玖玖爱在线观看资源,国产aⅴ综合网,午夜福利男女,日本亚洲欧美三级,日韩无码黄色导航,内射少妇13区,中文字幕高清网

您身邊的軟件定制專家--9年開發(fā)經(jīng)驗為您護航

18678812288
0531-88887250

Socket網(wǎng)絡(luò)編程常用的結(jié)構(gòu)及函數(shù)小結(jié)

文章作者:濟南軟件開發(fā) 時間:2016年12月20日

IP地址的作用是標示計算機的網(wǎng)卡地址,每臺計算機都有一個IP地址;端口,是指計算機中為了標示在計算機中訪問網(wǎng)絡(luò)的不同程序而設(shè)的編號,并不是網(wǎng)卡接線的端口,而是不同程序的邏輯編號,并不是實際存在的;域名,是用來代替IP地址來標示計算機的一種直觀名稱,例如百度網(wǎng)站的IP地址是202.108.22.43,這個IP地址沒有任何邏輯含義,不便記憶,而www.baidu.com是一個便于記憶的名稱,用于代替這個IP地址;套接字的本意是插座,在網(wǎng)絡(luò)中用來描述計算機中不同程序與其他計算機程序的通信方式。

  常用的套接字類型有3種:

  (1)流套接字(SOCK——STREAM):使用了面向連接的可靠的數(shù)據(jù)通信方式,即TCP協(xié)議;

 ?。?)數(shù)據(jù)報套接字(Raw Sockets):使用了不面向連接的數(shù)據(jù)傳輸方式,即UDP;

  (3)原始套接字(SOCK——RAW):沒有經(jīng)過處理的IP數(shù)據(jù)包,可以根據(jù)自己程序的要求進行封裝。

  網(wǎng)絡(luò)協(xié)議是指不同的計算機、不同的操作系統(tǒng)在進行網(wǎng)絡(luò)通信時的統(tǒng)一約定。網(wǎng)絡(luò)服務(wù)指的是網(wǎng)絡(luò)上的計算機通過運行程序為其他的計算機提供信息或運算的功能。

     套接字相關(guān)的數(shù)據(jù)類型:sockaddr和sockaddr_in;sockaddr用來保存一個套接字,定義如下:

struct sockaddr

{

    unsigned short int sa_family; //指定通信地址類型,如果是TCP/IP通信,則值為AF_inet

    char sa_data[14]; //最多用14個字符長度,用來保存IP地址和端口信息

};

  sockaddr_in的功能與socdaddr相同,也是用來保存一個套接字的信息,不同的是將IP地址與端口分開為不同的成員,定義如下:

struct sockaddr_in

{

    unsigned short int sin_family; //指定通信地址類型

    uint16_t sin_port; //套接字使用的端口號

    struct in_addr sin_addr; //需要訪問的IP地址

    unsigned char sin_zero[8]; //未使用的字段,填充為0

};

  在這一結(jié)構(gòu)中,in_addr也是一個結(jié)構(gòu)體,定義如下,用于保存一個IP地址:

struct in_addr

{

    uint32_t  s_addt;

};

  用域名取得主機的IP地址:

struct hostent *gethostbyname(const char *name);

  結(jié)構(gòu)體hostent的定義如下:

struct hostent

{

    char *h_name;//正式的主機名稱

    char **h_aliases;//這個主機的別名

    int  h_addrtype;//主機名的類型

    int  h_length;//地址的長度

    char **h_addr_list;//從域名服務(wù)器取得的主機地址

};

  用IP地址返回域名:

struct hostent *gethostbyaddr(const void *addr,socklen_t len,int type);

  由協(xié)議名取的協(xié)議數(shù)據(jù):

struct protoent *getprotobyname(char *name);

  結(jié)構(gòu)體protoent定義如下:

struct protoent

{

   char *p_name;//協(xié)議的名稱

   char **p_aliases;//協(xié)議的別名

   int p_proto;//協(xié)議的序號

};

  由協(xié)議編號取得協(xié)議信息:

struct protoent *getprotobynumber(int proto);

  取得系統(tǒng)支持的所有協(xié)議:

struct protoent *getprotoent(void);

  取得系統(tǒng)支持的網(wǎng)絡(luò)服務(wù):

struct servent *getservent(void);

  結(jié)構(gòu)體servent定義如下:

struct servent

{

   char *s_name;//這個服務(wù)的名稱

   char **s_aliases;//這個服務(wù)可能的別名

   int s_port;//這個服務(wù)可能的端口

   char *s_proto;//這個服務(wù)可能使用的協(xié)議

};

  用名稱取得系統(tǒng)所支持的服務(wù):

struct servent *getservbyname(char *name,char *proto); //name:服務(wù)器名稱,proto服務(wù)器所使用的協(xié)議;

  由端口取得服務(wù)名稱:

struct servent *getservbyport(int port,char *proto)

//port是端口的編號,需要注意的是這個端口號需要用htons()函數(shù)進行轉(zhuǎn)換,proto表示一個協(xié)議的字符串;

  將網(wǎng)絡(luò)地址轉(zhuǎn)換成長整型:

long inet_addr(char *cp); //cp表示一個IP地址字符串;

  將長整型IP地址轉(zhuǎn)換成網(wǎng)絡(luò)地址即大小端模式轉(zhuǎn)換:

char *inet_ntoa(struct in_addr in);

  將計算機中的32位長整型數(shù)轉(zhuǎn)換成網(wǎng)絡(luò)字符順序的32位長整型數(shù):

uint32_t htonl(uint32_t hostlong);

  將計算機中的16位整型數(shù)轉(zhuǎn)換成網(wǎng)絡(luò)字符順序的16位整型數(shù):

uint16_t htons(uint16_t hostshort);

  將網(wǎng)絡(luò)字符順序的32位長整型數(shù)轉(zhuǎn)換成計算機中的32位長整型數(shù):

uint32_t ntohl(uint32_t netlong);

  將網(wǎng)絡(luò)字符順序的16位整型數(shù)轉(zhuǎn)換成計算機中的16位整型數(shù):

uint16_t ntohs(uint16_t netshort);

  herror函數(shù)顯示錯誤:

void herror(const char *S); //s是一個字符串,函數(shù)先輸出這個字符串,然后輸出錯誤信息

  創(chuàng)建套接字函數(shù):

int socket(int domain,int type,int protocol);

//參數(shù)domain用于指定創(chuàng)建套接字所使用的協(xié)議族(可取AF_UNIX,AF_INET,AF_INTE6)

//參數(shù)type指定套接字的類型(可取SOCK_STREAM,SOCK_DGRAM,SOCK_RAW)

//參數(shù)protocol通常設(shè)置為0

  在指定套接字上創(chuàng)建鏈接函數(shù):

int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen);

//參數(shù)sockfd是一個由函數(shù)socket創(chuàng)建的套接字

//參數(shù)serv_addr是一個地址結(jié)構(gòu),指定服務(wù)器的IP地址和端口號

//參數(shù)addrlen為參數(shù)serv_addr的長度

  將一個套接字和某個端口綁定在一起的函數(shù):

int bind(int sockfd,struct sockaddr *my_addr,socklen_t addrlen);

//一般只有服務(wù)器端的程序調(diào)用,參數(shù)my_addr指定了sockfd將綁定到的本地地址,可以將參數(shù)my_addr的sin_addr設(shè)置為INADDR_ANY而不是某個確定IP地址就可以綁定到任何網(wǎng)絡(luò)接口。

  把套接字轉(zhuǎn)化為被動監(jiān)聽函數(shù):

int listen(int s,int backlog);

//參數(shù)s為套接字,參數(shù)backlog指定鏈接請求隊列的最大長度;

  接收連接請求函數(shù):

int accept(int s,struct sockaddr *addr,socklen_t *addrlen);

//參數(shù)s是由函數(shù)socket創(chuàng)建,經(jīng)函數(shù)bind綁定到本地某一端口上,然后通過函數(shù)listen轉(zhuǎn)化而來的監(jiān)聽套接字

//參數(shù)addr用來保存發(fā)起連接請求的主機的地址和端口

//參數(shù)addrlen是addr所指向的結(jié)構(gòu)體的大小

  在TCP套接字上發(fā)送數(shù)據(jù)函數(shù):

ssize_t send(int s,const void *msg,size_t len,int flags);

//函數(shù)只能對處于連接狀態(tài)的套接字使用,參數(shù)s為已建立好連接的套接字描述符,即accept函數(shù)的返回值

//參數(shù)msg指向存放待發(fā)送數(shù)據(jù)的緩沖區(qū)

//參數(shù)len為待發(fā)送數(shù)據(jù)的長度,參數(shù)flags為控制選項,一般設(shè)置為0

  在TCP套接字上接收數(shù)據(jù)函數(shù):

ssize_t recv(int s,void *buf,size_t len,int flags);

//函數(shù)recv從參數(shù)s所指定的套接字描述符(必須是面向連接的套接字)上接收數(shù)據(jù)并保存到參數(shù)buf所指定的緩沖區(qū)

//參數(shù)len則為緩沖區(qū)長度,參數(shù)flags為控制選項,一般設(shè)置為0

  在UCP套接字上發(fā)送數(shù)據(jù)函數(shù):

ssize_t sendto(int s,const void *msg,size_t len,int flags,const struct sockaddr *to,socklen_t tolen);

//函數(shù)功能與函數(shù)send類似,但函數(shù)sendto不需要套接字處于連接狀態(tài),所以該函數(shù)通常用來發(fā)送UDP數(shù)據(jù),同時因為是無連接的套接字,在使用sendto時需要指定數(shù)據(jù)的目的地址,參數(shù)msg指向待發(fā)送數(shù)據(jù)的緩沖區(qū)。

//參數(shù)len指定了待發(fā)送數(shù)據(jù)的長度

//參數(shù)flags是控制選項,含義與send函數(shù)中的一致

//參數(shù)to用于指定目的地址,目的地址的長度由tolen指定

  在UDP套接字上接收數(shù)據(jù)函數(shù):

ssize_t recvfrom(int s ,void *buf,size_t len,int flags,struct sockaddr *from,socklen_t *fromlen);

//與函數(shù)recv功能類似,只是函數(shù)recv只能用于面向連接的套接字,而函數(shù)recvfrom沒有此限制,可以用于從無連接的套接字上接收數(shù)據(jù)

//參數(shù)buf指向接收緩沖區(qū)

//參數(shù)len指定了緩沖區(qū)的大小

//參數(shù)flags是控制選項,含義與recv中的一致

//如果參數(shù)from非空,且該套接字不是面向連接的,則函數(shù)recvfrom返回時,參數(shù)from中將保存數(shù)據(jù)的源地址

//參數(shù)fromlen在調(diào)用recvfrom前為參數(shù)from的長度,調(diào)用recvfrom后將保存from的實際大小

  關(guān)閉套接字函數(shù):

int close(int fd);

//參數(shù)fd為一個套接字描述符;

  函數(shù) int shutdown(int s,int how) 功能與close類似,但是shutdown功能更強大,它允許對套接字進行單向關(guān)閉或全部禁止,參數(shù)s為待關(guān)閉的套接字描述符,參數(shù)how指定了關(guān)閉的方式?! ?/p>

  inet系列函數(shù)用于網(wǎng)絡(luò)地址的格式轉(zhuǎn)換;獲取和設(shè)置套接字屬性函數(shù):

int getsockopt(int s,int level,int optname,void *optval,cocklen_t *optlen);

int setsockopt(int s,int level,int optname,const void *optval,socklen_t optlen);

//參數(shù)s為一個套接字

//參數(shù)level是進行套接字選項操作的層次

//參數(shù)optname是套接字選項名稱

//對于函數(shù)getsockopt,參數(shù)opval用來存放獲得的套接字選項,參數(shù)optlen在調(diào)用函數(shù)前其值為optval指向的空間的大小,調(diào)用完后則其值為參數(shù)optval所保存的結(jié)果的實際大小

//對于函數(shù)setsockopt,參數(shù)optval是待設(shè)置的套接字選項的值,參數(shù)optlen是選項的長度

  多路復(fù)用函數(shù):

int select(int n,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);

//參數(shù)n是需要監(jiān)視的文件描述符數(shù)

//參數(shù)readfds指定需要監(jiān)視的可讀文件描述符集合

//參數(shù)writefds指定需要監(jiān)視的可寫文件描述符集合

//參數(shù)exceptfds指定需要監(jiān)視的異常文件描述符的集合

//參數(shù)timeout指定了阻塞的時間

     網(wǎng)絡(luò)編程中有很多新的概念和協(xié)議,要好好理解。還有一些系統(tǒng)定義的數(shù)據(jù)類型,要了解這些數(shù)據(jù)類型,方便使用。其次是要掌握一些常用函數(shù)的功能及使用方法,網(wǎng)絡(luò)編程我剛剛開始接觸,感覺跟前面有很大區(qū)別,必須進一步學(xué)習(xí)才能有所提高。


想要了解更多詳情歡迎來電咨詢18678812288
登陸網(wǎng)址:m.h6244.cn。
聯(lián)系人:王經(jīng)理。

岗巴县| 泽库县| 仪陇县| 德昌县| 正定县| 怀仁县| 和静县| 孟村| 云安县| 葫芦岛市| 澄迈县| 顺义区| 进贤县| 白水县| 太仆寺旗| 勐海县| 乌鲁木齐县| 廉江市| 镶黄旗| 阿合奇县| 桦川县| 广水市| 车险| 皋兰县| 怀宁县| 古田县| 泾川县| 安图县| 华容县| 芮城县| 黔西| 修文县| 大庆市| 大港区| 神农架林区| 丹江口市| 习水县| 清苑县| 舟曲县| 阿城市| 宁德市|