| 網(wǎng)站首頁 | 關(guān)于我們 | 開發(fā)優(yōu)勢 | 產(chǎn)品展示 |
| 合作企業(yè) | 新聞動態(tài) | 聯(lián)系我們 | 電話聯(lián)系 |
文章作者:濟南軟件開發(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)理。