返回顶部
首页 > 资讯 > 操作系统 >Linux下select异步通讯怎么实现
  • 669
分享到

Linux下select异步通讯怎么实现

linuxselect 2023-05-25 14:05:05 669人浏览 安东尼
摘要

这篇“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异步通讯怎么实现”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网服务器栏目。

--结束END--

本文标题: Linux下select异步通讯怎么实现

本文链接: https://lsjlt.com/news/218365.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Linux下select异步通讯怎么实现
    这篇“Linux下select异步通讯怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起...
    99+
    2023-05-25
    linux select
  • C#中怎么利用Socket实现异步通讯
    这篇文章将为大家详细讲解有关C#中怎么利用Socket实现异步通讯,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C# Socket异步通讯客户端之主程序:using System;using...
    99+
    2023-06-17
  • php异步通知怎么实现
    在PHP中实现异步通知可以通过以下两种方式: 使用curl发送异步请求:在接收到请求后,使用curl函数发送一个异步请求到指定的处...
    99+
    2023-10-27
    php
  • Vue Axios的异步通信怎么实现
    这篇文章主要介绍了Vue Axios的异步通信怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue Axios的异步通信怎么实现文章都会有所收获,下面我们一起来看看吧。1.什么是AxiosAxios是一...
    99+
    2023-06-29
  • Linux 下 PHP 如何实现异步编程?
    随着互联网的迅速发展,越来越多的网站和应用程序需要处理大量的请求和数据,这就要求我们的代码能够快速响应用户请求,并且能够高效地处理数据。而异步编程技术正是为了满足这一需求而出现的。 那么,什么是异步编程呢?简单来说,异步编程就是在程序运行...
    99+
    2023-09-12
    npm 异步编程 linux
  • Java8通过CompletableFuture怎么实现异步回调
    本篇内容介绍了“Java8通过CompletableFuture怎么实现异步回调”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 什么是Co...
    99+
    2023-06-30
  • php中异步通知是什么?怎么实现?
    PHP异步通知是指通过异步方式与另一个系统进行通信并实现数据的实时同步。异步通知与同步通知相比,具有更高的效率和更快的速度。在传统的同步通知中,系统会立即等待另一个系统的响应,如果响应过慢或者失败,会导致整个操作失败。而在异步通知中,系统直...
    99+
    2023-05-14
    异步通知 php
  • linux串口读写异步怎么实现
    在Linux系统中,可以使用文件IO的方式来实现串口的读写操作。具体的步骤如下:1. 打开串口设备文件: 使用`open()`函数来...
    99+
    2023-09-16
    linux
  • Linux异步通知技术怎么使用
    本篇内容主要讲解“Linux异步通知技术怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux异步通知技术怎么使用”吧!应用层接收SIGIO和其他信号一样,应用层需要注册一个信号处理函...
    99+
    2023-06-16
  • php异步通知如何实现
    这篇文章主要介绍“php异步通知如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php异步通知如何实现”文章能帮助大家解决问题。PHP异步通知是指通过异步方式与另一个系统进行通信并实现数据的实...
    99+
    2023-07-05
  • javascript怎么实现异步
    JavaScript是一门常用的编程语言,被广泛应用于web开发、游戏开发等领域。在JavaScript编程中,异步编程是一项重要的技术,它能够提高程序的性能和响应速度。那么,JavaScript怎样实现异步编程呢?本篇文章将从以下方面进行...
    99+
    2023-05-20
  • Java8通过CompletableFuture实现异步回调
    目录1 什么是CompletableFuture?2 为什么会有CompletableFuture ?3 CompletableFuture 简单使用4 CompletableFut...
    99+
    2024-04-02
  • ajax中怎么实现同步异步
    ajax中怎么实现同步异步,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。$("#btn_saveFWSB"...
    99+
    2024-04-02
  • react怎么实现通讯录
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。react怎么实现通讯录?react实现通讯录效果业务描述:通过react实现一个类似通讯录的页面,并可以通过点击侧边首字母跳转到对应的用户大致效果步骤1...
    99+
    2023-05-14
    React
  • js怎么实现异步串行与异步并行
    本篇内容主要讲解“js怎么实现异步串行与异步并行”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js怎么实现异步串行与异步并行”吧!js异步处理方案,js的异步串行与异步并行一、什么是串行,并行,...
    99+
    2023-07-05
  • python实现Linux异步epoll代码
    import socketimport select if __name__=="__main__": s=socket.socket(socket.AF_INET,socket.SOCK_STRE...
    99+
    2022-06-04
    代码 python Linux
  • python如何实现Linux异步epoll
    小编给大家分享一下python如何实现Linux异步epoll,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!代码如下:import socketimpo...
    99+
    2023-06-09
  • Python中怎么实现同步和异步
    Python中怎么实现同步和异步,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、同步与异步#同步编程(同一时间只能做一件事,做完了才能做下一件事情) ...
    99+
    2023-06-17
  • ajax中怎么通过异步加载实现局部刷新
    这篇文章给大家介绍ajax中怎么通过异步加载实现局部刷新,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。[html] view plain copy <sc...
    99+
    2024-04-02
  • Spring Cloud Alibaba(五)RocketMQ 异步通信实现
    本文探讨如何使用 RocketMQ Binder 完成 Spring Cloud 应用消息的订阅和发布。 介绍 RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务,广泛应用于多个...
    99+
    2014-06-01
    Spring Cloud Alibaba(五)RocketMQ 异步通信实现
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作