<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式Linux網(wǎng)絡(luò)編程之:網(wǎng)絡(luò)基礎(chǔ)編程

          嵌入式Linux網(wǎng)絡(luò)編程之:網(wǎng)絡(luò)基礎(chǔ)編程

          作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/257116.htm

          (3)使用實(shí)例。

          下面的實(shí)例給出了getaddrinfo函數(shù)用法的示例,在后面小節(jié)中會(huì)給出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ù)說(shuō)明。

          socket編程的基本函數(shù)有socket()、bind()、listen()、accept()、send()、sendto()、recv()以及recvfrom()等,其中根據(jù)客戶端還是服務(wù)端,或者根據(jù)使用TCP協(xié)議還是UDP協(xié)議,這些函數(shù)的調(diào)用流程都有所區(qū)別,這里先對(duì)每個(gè)函數(shù)進(jìn)行說(shuō)明,再給出各種情況下使用的流程圖。

          n socket():該函數(shù)用于建立一個(gè)socket連接,可指定socket類型等信息。在建立了socket連接之后,可對(duì)sockaddr或sockaddr_in結(jié)構(gòu)進(jìn)行初始化,以保存所建立的socket地址信息。

          n bind():該函數(shù)是用于將本地IP地址綁定到端口號(hào),若綁定其他IP地址則不能成功。另外,它主要用于TCP的連接,而在UDP的連接中則無(wú)必要。

          n listen():在服務(wù)端程序成功建立套接字和與地址進(jìn)行綁定之后,還需要準(zhǔn)備在該套接字上接收新的連接請(qǐng)求。此時(shí)調(diào)用listen()函數(shù)來(lái)創(chuàng)建一個(gè)等待隊(duì)列,在其中存放未處理的客戶端連接請(qǐng)求。

          n accept():服務(wù)端程序調(diào)用listen()函數(shù)創(chuàng)建等待隊(duì)列之后,調(diào)用accept()函數(shù)等待并接收客戶端的連接請(qǐng)求。它通常從由bind()所創(chuàng)建的等待隊(duì)列中取出第一個(gè)未處理的連接請(qǐng)求。

          n connect():該函數(shù)在TCP中是用于bind()的之后的client端,用于與服務(wù)器端建立連接,而在UDP中由于沒有了bind()函數(shù),因此用connect()有點(diǎn)類似bind()函數(shù)的作用。

          n send()和recv():這兩個(gè)函數(shù)分別用于發(fā)送和接收數(shù)據(jù),可以用在TCP中,也可以用在UDP中。當(dāng)用在UDP時(shí),可以在connect()函數(shù)建立連接之后再用。

          n sendto()和recvfrom():這兩個(gè)函數(shù)的作用與send()和recv()函數(shù)類似,也可以用在TCP和UDP中。當(dāng)用在TCP時(shí),后面的幾個(gè)與地址有關(guān)參數(shù)不起作用,函數(shù)作用等同于send()和recv();當(dāng)用在UDP時(shí),可以用在之前沒有使用connect()的情況下,這兩個(gè)函數(shù)可以自動(dòng)尋找指定地址并進(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ù)的語(yǔ)法要點(diǎn)。

          表10.8 socket()函數(shù)語(yǔ)法要點(diǎn)

          所需頭文件

          #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ù)報(bào)套接字socket

          SOCK_RAW:原始套接字socket

          protoco:0(原始套接字除外)

          函數(shù)返回值

          成功:非負(fù)套接字描述符

          出錯(cuò):-1

          表10.9列出了bind()函數(shù)的語(yǔ)法要點(diǎn)。

          表10.9 bind()函數(shù)語(yǔ)法要點(diǎn)

          所需頭文件

          #includesys/socket.h>

          函數(shù)原型

          intbind(intsockfd,structsockaddr*my_addr,intaddrlen)

          函數(shù)傳入值

          socktd:套接字描述符

          my_addr:本地地址

          addrlen:地址長(zhǎng)度

          函數(shù)返回值

          成功:0

          出錯(cuò):-1

          端口號(hào)和地址在my_addr中給出了,若不指定地址,則內(nèi)核隨意分配一個(gè)臨時(shí)端口給該應(yīng)用程序。

          表10.10列出了listen()函數(shù)的語(yǔ)法要點(diǎn)。

          表10.10 listen()函數(shù)語(yǔ)法要點(diǎn)

          所需頭文件

          #includesys/socket.h>

          函數(shù)原型

          intlisten(intsockfd,intbacklog)

          函數(shù)傳入值

          socktd:套接字描述符

          backlog:請(qǐng)求隊(duì)列中允許的最大請(qǐng)求數(shù),大多數(shù)系統(tǒng)缺省值為5

          函數(shù)返回值

          成功:0

          出錯(cuò):-1

          表10.11列出了accept()函數(shù)的語(yǔ)法要點(diǎn)。

          表10.11 accept()函數(shù)語(yǔ)法要點(diǎn)

          所需頭文件

          #includesys/socket.h>

          函數(shù)原型

          intaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen)

          函數(shù)傳入值

          socktd:套接字描述符

          addr:客戶端地址

          addrlen:地址長(zhǎng)度

          函數(shù)返回值

          成功:0

          出錯(cuò):-1

          表10.12列出了connect()函數(shù)的語(yǔ)法要點(diǎn)。

          表10.12 connect()函數(shù)語(yǔ)法要點(diǎn)

          所需頭文件

          #includesys/socket.h>

          函數(shù)原型

          intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen)

          函數(shù)傳入值

          socktd:套接字描述符

          serv_addr:服務(wù)器端地址

          addrlen:地址長(zhǎng)度

          函數(shù)返回值

          成功:0

          出錯(cuò):-1

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          linux相關(guān)文章:linux教程




          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();