我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Linux下select异步通讯怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Linux下select异步通讯怎么实现

这篇“Linux下select异步通讯怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux下select异步通讯怎么实现”文章吧。

1.服务器端


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <pthread.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <arpa/inet.h>
#include <unistd.h>

#define MAXBUF 1024

int main(int argc,char **argv){
  int sockfd,new_fd;
  socklen_t len;
  struct sockaddr_in my_addr,their_addr;
  unsigned int myport,lisnum;
  char buf[MAXBUF+1];
  fd_set rfds;
  struct timeval(argv[1]){
    myport = atoi(argv[1]);
  }
  else
    myport = 7838;

  if(argv[2]){
    lisnum = atoi(argv[2]);
  }
  else
    lisnum =2;
  if((sockfd = socket(PF_INET,SOCK_STREAM,0))== -1){
    perror("socket");
    exit(1);
  }

  bzero(&my_addr,sizeof(my_addr));
  my_addr.sin_family = PF_INET;
  my_addr.sin_port = htons(myport);
  if(argv[3])
    my_addr.sin_addr.s_addr = INADDR_ANY;
  
  if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr)) == -1){
    perror("bind");
    exit(1);
  }
  
  if(listen(sockfd, lisnum) == -1){
    perror("listen");
    exit(1);
  }
  
  while(1){
    printf("\n----waiting for new connecting to start new char----\n");
    len = sizeof(struct sockaddr);
    if((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&len)) == -1){
      perror("accept");
      exit(errno);
    }
    else
      printf("server:got connection from %s,port %d,socked %d\n",\
        inet_ntoa(their_addr.sin_addr),\
        ntohs(their_addr.sin_port),new_fd);
    
    
    //printf("\n---ready to go.now you can chatting...input enter,then you can chat---\n");
    while(1){
      
      FD_ZERO(&rfds);
      
      FD_SET(0,&rfds);
      maxfd = 0;
      
      FD_SET(new_fd,&rfds);
      if(new_fd > maxfd)
        maxfd = new_fd;
      
      tv.tv_sec = 1;
      tv.tv_usec = 0;

      retval = select(maxfd+1,&rfds,NULL,NULL,&tv);
      if(retval == -1){
        printf("select error!%s\n",strerror(errno));
        break;
      }
      else if(retval == 0){
        //printf("no message come,user no press the button,please wait...\n");
        continue;
      }
      else{

        if(FD_ISSET(new_fd,&rfds)){
        
          bzero(buf,MAXBUF+1);
          
          len = recv(new_fd, buf, MAXBUF, 0);
          if(len > 0)
            printf("recv msg success:%s! %d bytes rcv.\n ",buf,len);
          else{
            if(len < 0){
              printf("recv msg fail.the errno is:%d,error info is %s.\n",errno,strerror(errno));
            }
            else
              printf("quit.\n");
            break;
          }
        }// FD_ISSET = sockfd情况
        if(FD_ISSET(0,&rfds)){
          
          bzero(buf, MAXBUF+1);
          fgets(buf, MAXBUF, stdin);
          if(!strncasecmp(buf, "quit", 4)){
            printf("self request to quit the chating\n");
            break;
          }
          
          len = send(new_fd, buf, strlen(buf)-1 , 0);
          if(len < 0){
            printf("mgs:%s send fail!errno is:%d,error info is:%s\n", buf, errno, strerror(errno));
            break;
          }else{
            printf("msg: %s\t send success, send %d bytes!\n", buf, len);
          }
        }//FD_ISSET = 0
      
      }//select 处理结束
      
    }
    close(new_fd);
    
    printf("would you want to chatting with another one?(no->quit)");
    fflush(stdout);
    bzero(buf,MAXBUF+1);
    fgets(buf,MAXBUF,stdin);
    if(!strncasecmp(buf,"no",2)){
      printf("quit the chatting!\n");
      break;
    }
  
  }

  close(sockfd);
  return 0;
}

2.客户端


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <pthread.h>
#include <sys/time.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <resolv.h>

#define MAXBUF 1024
int main(int argc,char **argv){
  int sockfd,len;
  struct sockaddr_in dest;
  char buffer[MAXBUF+1];
  fd_set rfds;
  struct timeval(argc != 3){
    printf("the param style wrong!\n");
    exit(0);
  }
  
  if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0){
    perror("socket");
    exit(errno);
  }

  
  bzero(&dest,sizeof(dest));
  dest.sin_family = AF_INET;
  dest.sin_port = htons(atoi(argv[2]));
  if(inet_aton(argv[1],(struct in_addr *)&dest.sin_addr.s_addr) == 0){
    perror(argv[1]);
    exit(errno);
  }

  
  if(connect(sockfd,(struct sockaddr*)&dest,sizeof(dest)) !=0){
    perror("connect");
    exit(errno);
  }

  printf("\n---ready to chatting...---\n");
  while(1){
    
    FD_ZERO(&rfds);
    
    FD_SET(0,&rfds);
    maxfd = 0;
    
    FD_SET(sockfd,&rfds);
    if(sockfd > maxfd)
      maxfd = sockfd;
    
    tv.tv_sec = 1;
    tv.tv_usec = 0;
    
    retval = select(maxfd+1,&rfds,NULL,NULL,&tv);
    if(retval == -1){
      printf("select error,quit!\n");
      break;
    }else if(retval == 0){
      continue;
    }else{
      if(FD_ISSET(sockfd,&rfds)){
        
        bzero(buffer,MAXBUF+1);
        
        len = recv(sockfd, buffer, MAXBUF, 0);
        if(len > 0)
          printf("recv msg success:%s! %d bytes rcv.\n ",buffer,len);
        else{
          if(len < 0){
            printf("recv msg fail.the errno is:%d,error info is %s.\n",errno,strerror(errno));
          }
          else
            printf("quit.\n");
          break;
        }
      }// FD_ISSET = sockfd情况
      if(FD_ISSET(0,&rfds)){
        
        bzero(buffer, MAXBUF+1);
        fgets(buffer, MAXBUF, stdin);
        if(!strncasecmp(buffer, "quit", 4)){
          printf("self request to quit the chating\n");
          break;
        }
        
        len = send(sockfd, buffer, strlen(buffer)-1 , 0);
        if(len < 0){
          printf("mgs:%s send fail!errno is:%d,error info is:%s\n", buffer, errno, strerror(errno));
          break;
        }else{
          printf("msg: %s\t send success, send %d bytes!\n", buffer, len);
        }
      }//FD_ISSET = 0
      
    }//select 处理结束

  }//处理聊天的while 循环
  
  close(sockfd);
  return 0;
}

运行结果:

终端1:服务器端

[root@localhost net]# ./select_server 7838

----waiting for new connecting to start new char----
server:got connection from 172.31.100.236,port 59462,socked 4
recv msg success:kfldsjfk! 8 bytes rcv.
456354
 msg: 456354
         send success, send 6 bytes!
recv msg success:453455! 6 bytes rcv.

终端2:客户端

[root@localhost net]#  ./select_client 172.31.100.236 7838

---ready to chatting...---
kfldsjfk
msg: kfldsjfk
         send success, send 8 bytes!
recv msg success:456354! 6 bytes rcv.
453455
 msg: 453455
         send success, send 6 bytes!

以上就是关于“Linux下select异步通讯怎么实现”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网服务器栏目。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Linux下select异步通讯怎么实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Linux下select异步通讯怎么实现

这篇“Linux下select异步通讯怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux下select异步通讯
2023-05-25

C#中怎么利用Socket实现异步通讯

这篇文章将为大家详细讲解有关C#中怎么利用Socket实现异步通讯,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C# Socket异步通讯客户端之主程序:using System;using
2023-06-17

php异步通知怎么实现

在PHP中实现异步通知可以通过以下两种方式:使用curl发送异步请求:在接收到请求后,使用curl函数发送一个异步请求到指定的处理程序,然后立即返回响应。这样可以让请求的处理和响应的返回同时进行,从而实现异步通知。示例代码:// 接收到请
2023-10-27

Vue Axios的异步通信怎么实现

这篇文章主要介绍了Vue Axios的异步通信怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue Axios的异步通信怎么实现文章都会有所收获,下面我们一起来看看吧。1.什么是AxiosAxios是一
2023-06-29

Java8通过CompletableFuture怎么实现异步回调

本篇内容介绍了“Java8通过CompletableFuture怎么实现异步回调”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 什么是Co
2023-06-30

linux串口读写异步怎么实现

在Linux系统中,可以使用文件IO的方式来实现串口的读写操作。具体的步骤如下:1. 打开串口设备文件: 使用`open()`函数来打开串口设备文件,获取文件描述符。```cint fd = open("/dev/ttyS0", O_RDW
2023-09-16

Linux异步通知技术怎么使用

本篇内容主要讲解“Linux异步通知技术怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux异步通知技术怎么使用”吧!应用层接收SIGIO和其他信号一样,应用层需要注册一个信号处理函
2023-06-16

javascript怎么实现异步

JavaScript是一门常用的编程语言,被广泛应用于web开发、游戏开发等领域。在JavaScript编程中,异步编程是一项重要的技术,它能够提高程序的性能和响应速度。那么,JavaScript怎样实现异步编程呢?本篇文章将从以下方面进行说明。一、异步编程概述要深入了解JavaScript的异步编程,首先需要明确异步编程的概念。异步编程就是在程序执行某一动作时,同时可以执行其
2023-05-20

js怎么实现异步串行与异步并行

本篇内容主要讲解“js怎么实现异步串行与异步并行”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js怎么实现异步串行与异步并行”吧!js异步处理方案,js的异步串行与异步并行一、什么是串行,并行,
2023-07-05

Python中怎么实现同步和异步

Python中怎么实现同步和异步,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、同步与异步#同步编程(同一时间只能做一件事,做完了才能做下一件事情) <-a
2023-06-17

react怎么实现通讯录

react实现通讯录的方法:1、创建一批通讯录数据;2、准备左右两个dom容器,分别用于承载用户列表和首字母列表;3、生成用户列表和首字母列表;4、将首字母页面的id作为字母列表的值;5、把对应首字母页面的id传到方法里,然后通过h5的scrollIntoView方法跳转到对应的锚点即可。
2023-05-14

怎么实现JavaScript异步回调

这篇文章主要讲解了“怎么实现JavaScript异步回调”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现JavaScript异步回调”吧!什么是异步回调?异步回调是指在执行一个任务时,
2023-07-06

异步redis订阅怎么实现

异步Redis订阅可以通过使用Redis的pub/sub(发布/订阅)功能来实现。下面是一个使用Python的示例:```pythonimport asyncioimport aioredisasync def subscriber():r
2023-08-23

golang异步回调怎么实现

在Go语言中,可以使用goroutine和channel来实现异步回调的功能。首先,我们可以创建一个goroutine来执行异步的操作。在goroutine中,我们可以执行一些耗时的操作,然后将结果发送到一个channel中。下面的示例
2023-10-25

python异步回调怎么实现

在Python中,可以使用asyncio模块来实现异步回调。asyncio是Python 3.4及以上版本内置的异步IO框架。下面是一个简单的示例,演示了如何使用异步回调实现并发执行多个任务:import asyncio# 定义一个异步
python异步回调怎么实现
2024-02-29

编程热搜

目录