• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式Linux網絡編程之:網絡高級編程

    嵌入式Linux網絡編程之:網絡高級編程

    作者: 時間:2013-09-13 來源:網絡 收藏

    本文引用地址:http://www.czjhyjcfj.com/article/257115.htm

    10.3

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

    1.()

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

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

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

    下面是用fcntl()將套接字設置為非阻塞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);

    /*調用fcntl()函數給套接字設置非阻塞屬性*/

    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);

    }

    運行該程序,結果如下所示:

    $./net_fcntl

    Listening....

    accept:Resourcetemporarilyunavailable

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

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

    linux相關文章:linux教程



    上一頁 1 2 3 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 汾阳市| 高淳县| 宿松县| 青田县| 延寿县| 永昌县| 江阴市| 洪江市| 德格县| 上思县| 茶陵县| 台东县| 北海市| 襄垣县| 莱州市| 福鼎市| 绥江县| 杭锦旗| 吉安县| 长春市| 宁武县| 广水市| 栾川县| 民县| 苏尼特左旗| 金堂县| 清镇市| 郧西县| 凤山市| 璧山县| 曲沃县| 禹城市| 呼图壁县| 富顺县| 平安县| 丰县| 岳西县| 澄迈县| 巴塘县| 汤阴县| 深水埗区|