ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C语言 UDP服务器通过多路IO复用同时处理标准输入和套接字。当输入为quit时程序结束;当通过套接字收到对方消息时回射给对方

2021-09-12 21:02:27  阅读:166  来源: 互联网

标签:set int 对方 FD sockfd 接字 buf sizeof 输入


select();函数:

select函数原型:

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeval);

void FD_CLR(int fd, fd_set *set);

int FD_ISSET(int fd, fd_set *set);

void FD_SET(int fd, fd_set *set);

void FD_ZERO(fd_set *set);

服务器程序:

#define SIZE 32

int main()

{

      int sockfd=socket(AF_INET,SOCK_DGRAM,0);

      if(sockfd==-1)

      {

           perror("socket");

           return -1;

      }

      struct sockaddr_in saddr;

      bzero(&saddr,sizeof(saddr));

      saddr.sin_family=AF_INET;

      saddr.sin_port=htons(7777);

      saddr.sin_addr.s_addr=inet_addr("192.168.9.253");

      fd_set rfds,fds;

      FD_ZERO(&rfds);

      FD_SET(0,&rfds);

      FD_SET(sockfd,&rfds);

      int nfds=sockfd+1;

     

      int i=0;

     

      int ret=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));

      if(ret==-1)

      {

           perror("bind");

           close(sockfd);

           return -1;

      }

     

      char buf[SIZE]={0};

      while(1)

      {

           fds=rfds;

           select(nfds,&fds,NULL,NULL,NULL);

           for(i=0;i<nfds;i++)

           {

                 if(FD_ISSET(i,&fds))

                 {

                      if(i==0)

                      {

                            bzero(&buf,sizeof(buf));

                            fgets(buf,sizeof(buf)-1,stdin);

                            buf[strlen(buf)-1]='\0';

                      }else if(i==sockfd)

                      {

                            struct sockaddr dest;

                            socklen_t len=sizeof(dest);

                            ret=recvfrom(i,buf,sizeof(buf),0,(struct sockaddr*)&dest,&len);

                            if(ret==-1)

                            {

                                  perror("recvfrom");

                                  close(sockfd);

                                  return -1;

                            }

                            sendto(i,&buf,sizeof(buf),0,(struct sockaddr*)&dest,len);

                            printf("buf=%s\n",buf);

                            FD_SET(i,&rfds);

                            nfds=nfds>i+1? nfds:i+1;

                      }

                      }

                 }

           }

      close(i);

      return 0;

}

客户端程序:

#define SIZE 32

int main()

{

       int sockfd=socket(AF_INET,SOCK_DGRAM,0);

       if(sockfd==-1)

       {

              perror("socket");

              return -1;

       }

       char buf[SIZE]={0};

       struct sockaddr_in caddr;

       caddr.sin_family=AF_INET;

       caddr.sin_port=htons(7777);

       caddr.sin_addr.s_addr=inet_addr("192.168.9.253");

      

       fd_set rfds,fds;

       FD_ZERO(&rfds);

       FD_SET(0,&rfds);

       FD_SET(sockfd,&rfds);

      

       do{

              fds=rfds;

              select(4,&fds,NULL,NULL,NULL);

              if(FD_ISSET(0,&fds))

              {

                     bzero(&buf,sizeof(buf));

                     fgets(buf,sizeof(buf),stdin);

                     printf("-------\n");

                     int ret=sendto(sockfd,&buf,sizeof(buf),0,(struct sockaddr*)&caddr,sizeof(caddr));

                     if(ret==-1)

                     {

                            perror("sendto");

                            close(sockfd);

                            return -1;

                     }

                     printf("------->>>>>>>>>>s\n");

                     //write(sockfd,buf,sizeof(buf));

              }

              else if(FD_ISSET(sockfd,&fds))

              {

                     bzero(&buf,sizeof(buf));

                     recvfrom(sockfd,&buf,sizeof(buf),0,NULL,NULL);

                     printf("buf=%s\n",buf);

                    

              }

       }while(0!=strncmp(buf,"quit",4));

      

      

       close(sockfd);

       return 0;

}

标签:set,int,对方,FD,sockfd,接字,buf,sizeof,输入
来源: https://blog.csdn.net/YY646929594/article/details/120255760

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有