嵌入式Linux網(wǎng)絡(luò)編程之:網(wǎng)絡(luò)基礎(chǔ)編程
(3)使用實例。
下面的實例給出了getaddrinfo函數(shù)用法的示例,在后面小節(jié)中會給出gethostbyname函數(shù)用法的例子。
/*getaddrinfo.c*/
#includestdio.h>
#includestdlib.h>
#includeerrno.h>
#includestring.h>
#includenetdb.h>
#includesys/types.h>
#includenetinet/in.h>
#includesys/socket.h>
intmain()
{
structaddrinfohints,*res=NULL;
intrc;
memset(hints,0,sizeof(hints));
/*設(shè)置addrinfo結(jié)構(gòu)體中各參數(shù)*/
hints.ai_flags=AI_CANONNAME;
hints.ai_family=AF_UNSPEC;
hints.ai_socktype=SOCK_DGRAM;
hints.ai_protocol=IPPROTO_UDP;
/*調(diào)用getaddinfo函數(shù)*/
rc=getaddrinfo(localhost,NULL,hints,res);
if(rc!=0)
{
perror(getaddrinfo);
exit(1);
}
else
{
printf(Hostnameis%sn,res->ai_canonname);
}
exit(0);
}
10.2.3socket基礎(chǔ)編程
(1)函數(shù)說明。
socket編程的基本函數(shù)有socket()、bind()、listen()、accept()、send()、sendto()、recv()以及recvfrom()等,其中根據(jù)客戶端還是服務(wù)端,或者根據(jù)使用TCP協(xié)議還是UDP協(xié)議,這些函數(shù)的調(diào)用流程都有所區(qū)別,這里先對每個函數(shù)進(jìn)行說明,再給出各種情況下使用的流程圖。
n socket():該函數(shù)用于建立一個socket連接,可指定socket類型等信息。在建立了socket連接之后,可對sockaddr或sockaddr_in結(jié)構(gòu)進(jìn)行初始化,以保存所建立的socket地址信息。
n bind():該函數(shù)是用于將本地IP地址綁定到端口號,若綁定其他IP地址則不能成功。另外,它主要用于TCP的連接,而在UDP的連接中則無必要。
n listen():在服務(wù)端程序成功建立套接字和與地址進(jìn)行綁定之后,還需要準(zhǔn)備在該套接字上接收新的連接請求。此時調(diào)用listen()函數(shù)來創(chuàng)建一個等待隊列,在其中存放未處理的客戶端連接請求。
n accept():服務(wù)端程序調(diào)用listen()函數(shù)創(chuàng)建等待隊列之后,調(diào)用accept()函數(shù)等待并接收客戶端的連接請求。它通常從由bind()所創(chuàng)建的等待隊列中取出第一個未處理的連接請求。
n connect():該函數(shù)在TCP中是用于bind()的之后的client端,用于與服務(wù)器端建立連接,而在UDP中由于沒有了bind()函數(shù),因此用connect()有點類似bind()函數(shù)的作用。
n send()和recv():這兩個函數(shù)分別用于發(fā)送和接收數(shù)據(jù),可以用在TCP中,也可以用在UDP中。當(dāng)用在UDP時,可以在connect()函數(shù)建立連接之后再用。
n sendto()和recvfrom():這兩個函數(shù)的作用與send()和recv()函數(shù)類似,也可以用在TCP和UDP中。當(dāng)用在TCP時,后面的幾個與地址有關(guān)參數(shù)不起作用,函數(shù)作用等同于send()和recv();當(dāng)用在UDP時,可以用在之前沒有使用connect()的情況下,這兩個函數(shù)可以自動尋找指定地址并進(jìn)行連接。
服務(wù)器端和客戶端使用TCP協(xié)議的流程如圖10.6所示。
服務(wù)器端和客戶端使用UDP協(xié)議的流程如圖10.7所示。
圖10.6使用TCP協(xié)議socket編程流程圖圖10.7使用UDP協(xié)議socket編程流程圖
(2)函數(shù)格式。
表10.8列出了socket()函數(shù)的語法要點。
表10.8 socket()函數(shù)語法要點
所需頭文件 | #includesys/socket.h> | |
函數(shù)原型 | intsocket(intfamily,inttype,intprotocol) | |
函數(shù)傳入值 | family: 協(xié)議族 | AF_INET:IPv4協(xié)議 |
AF_INET6:IPv6協(xié)議 | ||
AF_LOCAL:UNIX域協(xié)議 | ||
AF_ROUTE:路由套接字(socket) | ||
AF_KEY:密鑰套接字(socket) | ||
type: 套接字類型 | SOCK_STREAM:字節(jié)流套接字socket | |
SOCK_DGRAM:數(shù)據(jù)報套接字socket | ||
SOCK_RAW:原始套接字socket | ||
protoco:0(原始套接字除外) | ||
函數(shù)返回值 | 成功:非負(fù)套接字描述符 | |
出錯:-1 |
表10.9列出了bind()函數(shù)的語法要點。
表10.9 bind()函數(shù)語法要點
所需頭文件 | #includesys/socket.h> |
函數(shù)原型 | intbind(intsockfd,structsockaddr*my_addr,intaddrlen) |
函數(shù)傳入值 | socktd:套接字描述符 |
my_addr:本地地址 | |
addrlen:地址長度 | |
函數(shù)返回值 | 成功:0 |
出錯:-1 |
端口號和地址在my_addr中給出了,若不指定地址,則內(nèi)核隨意分配一個臨時端口給該應(yīng)用程序。
表10.10列出了listen()函數(shù)的語法要點。
表10.10 listen()函數(shù)語法要點
所需頭文件 | #includesys/socket.h> |
函數(shù)原型 | intlisten(intsockfd,intbacklog) |
函數(shù)傳入值 | socktd:套接字描述符 |
backlog:請求隊列中允許的最大請求數(shù),大多數(shù)系統(tǒng)缺省值為5 | |
函數(shù)返回值 | 成功:0 |
出錯:-1 |
表10.11列出了accept()函數(shù)的語法要點。
表10.11 accept()函數(shù)語法要點
所需頭文件 | #includesys/socket.h> |
函數(shù)原型 | intaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen) |
函數(shù)傳入值 | socktd:套接字描述符 |
addr:客戶端地址 | |
addrlen:地址長度 | |
函數(shù)返回值 | 成功:0 |
出錯:-1 |
表10.12列出了connect()函數(shù)的語法要點。
表10.12 connect()函數(shù)語法要點
所需頭文件 | #includesys/socket.h> |
函數(shù)原型 | intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen) |
函數(shù)傳入值 | socktd:套接字描述符 |
serv_addr:服務(wù)器端地址 | |
addrlen:地址長度 | |
函數(shù)返回值 | 成功:0 |
出錯:-1 |
linux相關(guān)文章:linux教程
評論