新聞中心

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

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

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

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

        2.()

        使用()函數雖然可以實現非阻塞I/O或信號驅動I/O,但在實際使用時往往會對資源是否準備完畢進行循環測試,這樣就大大增加了不必要的CPU資源的占用。在這里可以使用()函數來解決這個問題,同時,使用()函數還可以設置等待的時間,可以說功能更加強大。下面是使用select()函數的服務器端源代碼。客戶端程序基本上與10.2.3小節中的例子相同,僅加入一行sleep()函數,使得客戶端進程等待幾秒鐘才結束。

        /*net_select.c*/

        #includesys/types.h>

        #includesys/socket.h>

        #includestdio.h>

        #includestdlib.h>

        #includestring.h>

        #includesys/time.h>

        #includesys/ioctl.h>

        #includeunistd.h>

        #includenetinet/in.h>

        #definePORT4321

        #defineMAX_QUE_CONN_NM5

        #defineMAX_SOCK_FDFD_SETSIZE

        #defineBUFFER_SIZE1024

        intmain()

        {

        structsockaddr_inserver_sockaddr,client_sockaddr;

        intsin_size,count;

        fd_setinset,tmp_inset;

        intsockfd,client_fd,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);

        /*將調用socket()函數的描述符作為文件描述符*/

        FD_ZERO(inset);

        FD_SET(sockfd,inset);

        while(1)

        {

        tmp_inset=inset;

        sin_size=sizeof(structsockaddr_in);

        memset(buf,0,sizeof(buf));

        /*調用select()函數*/

        if(!(select(MAX_SOCK_FD,tmp_inset,NULL,NULL,NULL)>0))

        {

        perror(select);

        }

        for(fd=0;fdMAX_SOCK_FD;fd++)

        {

        if(FD_ISSET(fd,tmp_inset)>0)

        {

        if(fd==sockfd)

        {/*服務端接收客戶端的連接請求*/

        if((client_fd=accept(sockfd,

        (structsockaddr*)client_sockaddr,sin_size))==-1)

        {

        perror(accept);

        exit(1);

        }

        FD_SET(client_fd,inset);

        printf(Newconnectionfrom%d(socket)n,client_fd);

        }

        else/*處理從客戶端發來的消息*/

        {

        if((count=recv(client_fd,buf,BUFFER_SIZE,0))>0)

        {

        printf(Receivedamessagefrom%d:%sn,

        client_fd,buf);

        }

        else

        {

        close(fd);

        FD_CLR(fd,inset);

        printf(Client%d(socket)hasleftn,fd);

        }

        }

        }/*endofifFD_ISSET*/

        }/*endofforfd*/

        }/*endifwhilewhile*/

        close(sockfd);

        exit(0);

        }

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

        linux相關文章:linux教程




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 无棣县| 弥渡县| 哈密市| 临沂市| 特克斯县| 淄博市| 浦江县| 泸定县| 安义县| 吴忠市| 定南县| 新余市| 开远市| 楚雄市| 刚察县| 彭山县| 祁东县| 年辖:市辖区| 烟台市| 临高县| 宝应县| 泰来县| 图木舒克市| 绥棱县| 天祝| 化州市| 康保县| 旬邑县| 富阳市| 定州市| 仪陇县| 金门县| 太白县| 汾西县| 德保县| 大竹县| 五峰| 平泉县| 张北县| 通河县| 齐齐哈尔市|