Rumah Operasi dan penyelenggaraan operasi dan penyelenggaraan linux Bagaimana untuk melaksanakan komunikasi tak segerak terpilih di bawah Linux

Bagaimana untuk melaksanakan komunikasi tak segerak terpilih di bawah Linux

May 15, 2023 am 09:28 AM
linux socket

1. Bahagian pelayan

/*select_server.c 2011.9.2 by yyg*/
#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);
      /*把标准输入句柄0加入到集合中*/
      FD_SET(0,&rfds);
      maxfd = 0;
      /*把当前连接句柄new_fd加入到集合中*/
      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)){
        /*连接的socket 上有消息则接收并显示*/
          bzero(buf,MAXBUF+1);
          /*接收对方发过来的消息,最多MAXBUF字节*/
          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 处理结束
      
    }/*内while*/
    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;
    }
  
  }/*外while*/

  close(sockfd);
  return 0;
}
Salin selepas log masuk

2. Pelanggan

/*select_client.c 2011.9.2 by yyg*/
#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);
  }
  /*创建一个socket用于tcp通信*/
  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);
  }

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

  printf("\n---ready to chatting...---\n");
  while(1){
    /*把集合清空*/
    FD_ZERO(&rfds);
    /*把标准输入句柄0加入到集合中*/
    FD_SET(0,&rfds);
    maxfd = 0;
    /*把当前连接句柄socket 加入到集合中*/
    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)){
        /*连接的socket 上有消息则接收并显示*/
        bzero(buffer,MAXBUF+1);
        /*接收对方发过来的消息,最多MAXBUF字节*/
        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;
}
Salin selepas log masuk

Keputusan berjalan:

Terminal 1: Bahagian pelayan

[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.
Salin selepas log masuk

Terminal 2 : Pelanggan

[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!
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan komunikasi tak segerak terpilih di bawah Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Perbezaan antara centos dan ubuntu Perbezaan antara centos dan ubuntu Apr 14, 2025 pm 09:09 PM

Perbezaan utama antara CentOS dan Ubuntu adalah: asal (CentOS berasal dari Red Hat, untuk perusahaan; Ubuntu berasal dari Debian, untuk individu), pengurusan pakej (CentOS menggunakan yum, yang memberi tumpuan kepada kestabilan; Ubuntu menggunakan APT, untuk kekerapan yang tinggi) Pelbagai tutorial dan dokumen), kegunaan (CentOS berat sebelah ke arah pelayan, Ubuntu sesuai untuk pelayan dan desktop), perbezaan lain termasuk kesederhanaan pemasangan (CentOS adalah nipis)

Cara memasang centos Cara memasang centos Apr 14, 2025 pm 09:03 PM

Langkah Pemasangan CentOS: Muat turun Imej ISO dan Burn Bootable Media; boot dan pilih sumber pemasangan; Pilih susun atur bahasa dan papan kekunci; Konfigurasikan rangkaian; memisahkan cakera keras; Tetapkan jam sistem; Buat pengguna root; pilih pakej perisian; Mulakan pemasangan; Mulakan semula dan boot dari cakera keras selepas pemasangan selesai.

CentOS berhenti penyelenggaraan 2024 CentOS berhenti penyelenggaraan 2024 Apr 14, 2025 pm 08:39 PM

CentOS akan ditutup pada tahun 2024 kerana pengedaran hulu, RHEL 8, telah ditutup. Penutupan ini akan menjejaskan sistem CentOS 8, menghalangnya daripada terus menerima kemas kini. Pengguna harus merancang untuk penghijrahan, dan pilihan yang disyorkan termasuk CentOS Stream, Almalinux, dan Rocky Linux untuk memastikan sistem selamat dan stabil.

Penjelasan terperinci mengenai Prinsip Docker Penjelasan terperinci mengenai Prinsip Docker Apr 14, 2025 pm 11:57 PM

Docker menggunakan ciri -ciri kernel Linux untuk menyediakan persekitaran berjalan yang cekap dan terpencil. Prinsip kerjanya adalah seperti berikut: 1. Cermin digunakan sebagai templat baca sahaja, yang mengandungi semua yang anda perlukan untuk menjalankan aplikasi; 2. Sistem Fail Kesatuan (Unionfs) menyusun pelbagai sistem fail, hanya menyimpan perbezaan, menjimatkan ruang dan mempercepatkan; 3. Daemon menguruskan cermin dan bekas, dan pelanggan menggunakannya untuk interaksi; 4. Ruang nama dan cgroups melaksanakan pengasingan kontena dan batasan sumber; 5. Pelbagai mod rangkaian menyokong interkoneksi kontena. Hanya dengan memahami konsep -konsep teras ini, anda boleh menggunakan Docker dengan lebih baik.

Pilihan Centos setelah menghentikan penyelenggaraan Pilihan Centos setelah menghentikan penyelenggaraan Apr 14, 2025 pm 08:51 PM

CentOS telah dihentikan, alternatif termasuk: 1. Rocky Linux (keserasian terbaik); 2. Almalinux (serasi dengan CentOS); 3. Ubuntu Server (Konfigurasi diperlukan); 4. Red Hat Enterprise Linux (versi komersial, lesen berbayar); 5. Oracle Linux (serasi dengan CentOS dan RHEL). Apabila berhijrah, pertimbangan adalah: keserasian, ketersediaan, sokongan, kos, dan sokongan komuniti.

Apa yang Harus Dilakukan Setelah CentOs Berhenti Penyelenggaraan Apa yang Harus Dilakukan Setelah CentOs Berhenti Penyelenggaraan Apr 14, 2025 pm 08:48 PM

Selepas CentOS dihentikan, pengguna boleh mengambil langkah -langkah berikut untuk menanganinya: Pilih pengedaran yang serasi: seperti Almalinux, Rocky Linux, dan CentOS Stream. Berhijrah ke pengagihan komersial: seperti Red Hat Enterprise Linux, Oracle Linux. Menaik taraf ke CentOS 9 Stream: Pengagihan Rolling, menyediakan teknologi terkini. Pilih pengagihan Linux yang lain: seperti Ubuntu, Debian. Menilai pilihan lain seperti bekas, mesin maya, atau platform awan.

Cara menggunakan desktop docker Cara menggunakan desktop docker Apr 15, 2025 am 11:45 AM

Bagaimana cara menggunakan desktop Docker? Docktop Docktop adalah alat untuk menjalankan bekas Docker pada mesin tempatan. Langkah -langkah untuk digunakan termasuk: 1. Pasang desktop Docker; 2. Mulakan desktop Docker; 3. Buat imej Docker (menggunakan Dockerfile); 4. Membina imej Docker (menggunakan Docker Build); 5. Jalankan bekas Docker (menggunakan Docker Run).

Konfigurasi komputer apa yang diperlukan untuk vscode Konfigurasi komputer apa yang diperlukan untuk vscode Apr 15, 2025 pm 09:48 PM

Keperluan Sistem Kod Vs: Sistem Operasi: Windows 10 dan ke atas, MACOS 10.12 dan ke atas, pemproses pengedaran Linux: minimum 1.6 GHz, disyorkan 2.0 GHz dan ke atas memori: minimum 512 MB, disyorkan 4 GB dan ke atas ruang penyimpanan: minimum 250 mb, disyorkan 1 GB dan di atas keperluan lain:

See all articles