日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Linux网络编程——tcp并发服务器(poll实现)

發布時間:2023/11/30 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux网络编程——tcp并发服务器(poll实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://blog.csdn.net/lianghe_work/article/details/46535859

想詳細徹底地了解poll或看懂下面的代碼請參考《Linux網絡編程——I/O復用之poll函數》

代碼:

  • #include <string.h>
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <unistd.h>
  • #include <sys/select.h>
  • #include <sys/time.h>
  • #include <sys/socket.h>
  • #include <netinet/in.h>
  • #include <arpa/inet.h>
  • #include <poll.h>
  • #include <errno.h>
  • #define OPEN_MAX 100
  • int main(int argc, char *argv[])
  • {
  • //1.創建tcp監聽套接字
  • int sockfd = socket(AF_INET, SOCK_STREAM, 0);
  • //2.綁定sockfd
  • struct sockaddr_in my_addr;
  • bzero(&my_addr, sizeof(my_addr));
  • my_addr.sin_family = AF_INET;
  • my_addr.sin_port = htons(8000);
  • my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  • bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr));
  • //3.監聽listen
  • listen(sockfd, 10);
  • //4.poll相應參數準備
  • struct pollfd client[OPEN_MAX];
  • int i = 0, maxi = 0;
  • for(;i<OPEN_MAX; i++)
  • client[i].fd = -1;//初始化poll結構中的文件描述符fd
  • client[0].fd = sockfd;//需要監測的描述符
  • client[0].events = POLLIN;//普通或優先級帶數據可讀
  • //5.對已連接的客戶端的數據處理
  • while(1)
  • {
  • int ret = poll(client, maxi+1, -1);//對加入poll結構體數組所有元素進行監測
  • //5.1監測sockfd(監聽套接字)是否存在連接
  • if((client[0].revents & POLLIN) == POLLIN )
  • {
  • struct sockaddr_in cli_addr;
  • int clilen = sizeof(cli_addr);
  • int connfd = 0;
  • //5.1.1 從tcp完成連接中提取客戶端
  • connfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
  • //5.1.2 將提取到的connfd放入poll結構體數組中,以便于poll函數監測
  • for(i=1; i<OPEN_MAX; i++)
  • {
  • if(client[i].fd < 0)
  • {
  • client[i].fd = connfd;
  • client[i].events = POLLIN;
  • break;
  • }
  • }
  • //5.1.3 maxi更新
  • if(i > maxi)
  • maxi = i;
  • //5.1.4 如果沒有就緒的描述符,就繼續poll監測,否則繼續向下看
  • if(--ret <= 0)
  • continue;
  • }
  • //5.2繼續響應就緒的描述符
  • for(i=1; i<=maxi; i++)
  • {
  • if(client[i].fd < 0)
  • continue;
  • if(client[i].revents & (POLLIN | POLLERR))
  • {
  • int len = 0;
  • char buf[128] = "";
  • //5.2.1接受客戶端數據
  • if((len = recv(client[i].fd, buf, sizeof(buf), 0)) < 0)
  • {
  • if(errno == ECONNRESET)//tcp連接超時、RST
  • {
  • close(client[i].fd);
  • client[i].fd = -1;
  • }
  • else
  • perror("read error:");
  • }
  • else if(len == 0)//客戶端關閉連接
  • {
  • close(client[i].fd);
  • client[i].fd = -1;
  • }
  • else//正常接收到服務器的數據
  • send(client[i].fd, buf, len, 0);
  • //5.2.2所有的就緒描述符處理完了,就退出當前的for循環,繼續poll監測
  • if(--ret <= 0)
  • break;
  • }
  • }
  • }
  • return 0;
  • }

  • 運行結果:

    總結

    以上是生活随笔為你收集整理的Linux网络编程——tcp并发服务器(poll实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。