中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

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

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

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

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

        10.3

        在實際情況中,人們往往遇到多個客戶端連接服務(wù)器端的情況。由于之前介紹的如connet()、recv()和send()等都是阻塞性函數(shù),如果資源沒有準(zhǔn)備好,則調(diào)用該函數(shù)的進(jìn)程將進(jìn)入睡眠狀態(tài),這樣就無法處理I/O多路復(fù)用的情況了。本節(jié)給出了兩種解決I/O多路復(fù)用的解決方法,這兩個函數(shù)都是之前學(xué)過的()和()(請讀者先復(fù)習(xí)第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;/*允許重復(fù)使用本地地址與套接字進(jìn)行綁定*/

        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

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

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

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



        上一頁 1 2 3 下一頁

        評論


        相關(guān)推薦

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

        關(guān)閉