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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > 嵌入式Linux網(wǎng)絡(luò)編程之:網(wǎng)絡(luò)高級編程

          嵌入式Linux網(wǎng)絡(luò)編程之:網(wǎng)絡(luò)高級編程

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

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

          10.3

          在實際情況中,人們往往遇到多個客戶端連接服務器端的情況。由于之前介紹的如connet()、recv()和send()等都是阻塞性函數(shù),如果資源沒有準備好,則調(diào)用該函數(shù)的進程將進入睡眠狀態(tài),這樣就無法處理I/O多路復用的情況了。本節(jié)給出了兩種解決I/O多路復用的解決方法,這兩個函數(shù)都是之前學過的()和()(請讀者先復習第6章中的相關(guān)內(nèi)容)??梢钥吹剑捎谠贚inux中把socket也作為一種特殊文件描述符,這給用戶的處理帶來了很大的方便。

          1.()

          函數(shù)()針對socket編程提供了如下的編程特性。

          n 非阻塞I/O:可將cmd設(shè)置為F_SETFL,將lock設(shè)置為O_NONBLOCK。

          n 異步I/O:可將cmd設(shè)置為F_SETFL,將lock設(shè)置為O_ASYNC。

          下面是用fcntl()將套接字設(shè)置為非阻塞I/O的實例代碼:

          /*net_fcntl.c*/

          #includesys/types.h>

          #includesys/socket.h>

          #includesys/wait.h>

          #includestdio.h>

          #includestdlib.h>

          #includeerrno.h>

          #includestring.h>

          #includesys/un.h>

          #includesys/time.h>

          #includesys/ioctl.h>

          #includeunistd.h>

          #includenetinet/in.h>

          #includefcntl.h>

          #definePORT1234

          #defineMAX_QUE_CONN_NM5

          #defineBUFFER_SIZE1024

          intmain()

          {

          structsockaddr_inserver_sockaddr,client_sockaddr;

          intsin_size,recvbytes,flags;

          intsockfd,client_fd;

          charbuf[BUFFER_SIZE];

          if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)

          {

          perror(socket);

          exit(1);

          }

          server_sockaddr.sin_family=AF_INET;

          server_sockaddr.sin_port=htons(PORT);

          server_sockaddr.sin_addr.s_addr=INADDR_ANY;

          bzero((server_sockaddr.sin_zero),8);

          inti=1;/*允許重復使用本地地址與套接字進行綁定*/

          setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,i,sizeof(i));

          if(bind(sockfd,(structsockaddr*)server_sockaddr,

          sizeof(structsockaddr))==-1)

          {

          perror(bind);

          exit(1);

          }

          if(listen(sockfd,MAX_QUE_CONN_NM)==-1)

          {

          perror(listen);

          exit(1);

          }

          printf(Listening....n);

          /*調(diào)用fcntl()函數(shù)給套接字設(shè)置非阻塞屬性*/

          flags=fcntl(sockfd,F_GETFL);

          if(flags0||fcntl(sockfd,F_SETFL,flags|O_NONBLOCK)0)

          {

          perror(fcntl);

          exit(1);

          }

          while(1)

          {

          sin_size=sizeof(structsockaddr_in);

          if((client_fd=accept(sockfd,

          (structsockaddr*)client_sockaddr,sin_size))0)

          {

          perror(accept);

          exit(1);

          }

          if((recvbytes=recv(client_fd,buf,BUFFER_SIZE,0))0)

          {

          perror(recv);

          exit(1);

          }

          printf(Receivedamessage:%sn,buf);

          }/*while*/

          close(client_fd);

          exit(1);

          }

          運行該程序,結(jié)果如下所示:

          $./net_fcntl

          Listening....

          accept:Resourcetemporarilyunavailable

          可以看到,當accept()的資源不可用(沒有任何未處理的等待連接的請求)時,程序就會自動返回。

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

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



          上一頁 1 2 3 下一頁

          評論


          相關(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); })();