Heim Betrieb und Instandhaltung Betrieb und Wartung von Linux So implementieren Sie mehrere Clients, um über einen Linux-Socket eine Verbindung zum Server herzustellen

So implementieren Sie mehrere Clients, um über einen Linux-Socket eine Verbindung zum Server herzustellen

May 20, 2023 pm 11:10 PM
linux socket

1. Einführung

In tatsächlichen Situationen stoßen Menschen häufig auf mehrere Clients, die eine Verbindung zum Server herstellen. Da die zuvor eingeführten Funktionen wie Verbinden, Empfangen, Senden usw. alle blockierende Funktionen sind, wechselt der Prozess, der die Funktion aufruft, in den Ruhezustand, wenn die Ressourcen nicht vollständig vorbereitet sind, und kann das E/A-Multiplexen nicht verarbeiten. .

Dieser Artikel beschreibt zwei Methoden des I/O-Multiplexings: fcntl(), select(). Es ist ersichtlich, dass Linux den Socket als speziellen Dateideskriptor behandelt, was den Benutzern großen Komfort bietet.

2. Die Funktion fcntl

fcntl() hat die folgenden Eigenschaften:

1) Nicht blockierende E/A: Sie können cmd auf F_SETFL setzen und auf O_NONBLOCK sperren

2) Signalgesteuerte E/A : Ja Setzen Sie cmd auf F_SETFL und sperren Sie es auf O_ASYNC.

Routine:

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/un.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>

#define SERVPORT 3333
#define BACKLOG 10
#define MAX_CONNECTED_NO 10
#define MAXDATASIZE 100

int main()
{
  struct sockaddr_in server_sockaddr,client_sockaddr;
  int sin_size,recvbytes,flags;
  int sockfd,client_fd;
  char buf[MAXDATASIZE];
/*创建socket*/
  if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){
    perror("socket");
    exit(1);
  }
  printf("socket success!,sockfd=%d\n",sockfd);

/*设置sockaddr结构*/
  server_sockaddr.sin_family=AF_INET;
  server_sockaddr.sin_port=htons(SERVPORT);
  server_sockaddr.sin_addr.s_addr=INADDR_ANY;
  bzero(&(server_sockaddr.sin_zero),8);

/*将本地ip地址绑定端口号*/
  if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr))==-1){
    perror("bind");
    exit(1);
  }
  printf("bind success!\n");

/*监听*/
  if(listen(sockfd,BACKLOG)==-1){
    perror("listen");
    exit(1);
  }
  printf("listening....\n");

/*fcntl()函数,处理多路复用I/O*/
  if((flags=fcntl( sockfd, F_SETFL, 0))<0)
      perror("fcntl F_SETFL");
    flags |= O_NONBLOCK;
    if(fcntl( sockfd, F_SETFL,flags)<0)
      perror("fcntl");
  while(1){
    sin_size=sizeof(struct sockaddr_in);
    if((client_fd=accept(sockfd,(struct sockaddr*)&client_sockaddr,&sin_size))==-1){  //服务器接受客户端的请求,返回一个新的文件描述符
      perror("accept");
      exit(1);
    }
    if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1){
      perror("recv");
      exit(1);
    }
    if(read(client_fd,buf,MAXDATASIZE)<0){
      perror("read");
      exit(1);
    }
    printf("received a connection :%s",buf);

/*关闭连接*/
  close(client_fd);
  exit(1);
  }/*while*/
}
Nach dem Login kopieren

Führen Sie das Programm aus:

[root@localhost net]# ./fcntl
socket success!,sockfd=3
bind success!
listening....
accept: Resource temporarily unavailable
Nach dem Login kopieren

Sie können sehen, dass das Programm automatisch zurückkehrt, wenn die Akzeptanzressource nicht verfügbar ist.

Wenn Sie den roten Fettdruck-Code ersetzen durch:

if((flags=fcntl( sockfd, F_SETFL, 0))<0)
      perror("fcntl F_SETFL");
    flags |= O_ASYNC;
    if(fcntl( sockfd, F_SETFL,flags)<0)
      perror("fcntl");
Nach dem Login kopieren

Das laufende Ergebnis ist wie folgt:

[root@localhost net]# ./fcntl1
socket success!,sockfd = 3
bind success!
listening...
Nach dem Login kopieren

Sie können sehen, dass der Prozess wartet, bis ein anderes relevantes Signal ihn antreibt.

Drei, wählen Sie

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/un.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netinet/in.h>
#define SERVPORT 3333
#define BACKLOG 10
#define MAX_CONNECTED_NO 10
#define MAXDATASIZE 100
int main()
{
  struct sockaddr_in server_sockaddr,client_sockaddr;
  int sin_size,recvbytes;
  fd_set readfd;
  fd_set writefd;
  int sockfd,client_fd;
  char buf[MAXDATASIZE];
/*创建socket*/
  if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){
    perror("socket");
    exit(1);
  }
  printf("socket success!,sockfd=%d\n",sockfd);
/*设置sockaddr结构*/
  server_sockaddr.sin_family=AF_INET;
  server_sockaddr.sin_port=htons(SERVPORT);
  server_sockaddr.sin_addr.s_addr=INADDR_ANY;
  bzero(&(server_sockaddr.sin_zero),8);
/*将本地ip地址绑定端口号*/
  if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr))==-1){
    perror("bind");
    exit(1);
  }
  printf("bind success!\n");
/*监听*/
  if(listen(sockfd,BACKLOG)==-1){
    perror("listen");
    exit(1);
  }
  printf("listening....\n");
/*select*/
  FD_ZERO(&readfd);              // 将readfd 清空 
FD_SET(sockfd,&readfd);         //将sockfd加入到readfd集合中
  while(1){
  sin_size=sizeof(struct sockaddr_in);
  if(select(MAX_CONNECTED_NO,&readfd,NULL,NULL,(struct timeval(FD_ISSET(sockfd,&readfd)>0){         // FD_ISSET 这个宏判断 sockfd 是否属于可读的文件描述符。从 sockfd 中读入, 输出到标准输出上去.
      if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size))==-1){   //client_sockaddr:客户端地址
        perror("accept");
        exit(1);
      }
      if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1){
        perror("recv");
        exit(1);
      }
      if(read(client_fd,buf,MAXDATASIZE)<0){
        perror("read");
        exit(1);
      }
      printf("received a connection :%s",buf);
    }/*if*/
    close(client_fd);
    }/*select*/
  }/*while*/
}
运行结果如下:
[root@localhost net]#  gcc select1.c -o select1
[root@localhost net]# ./select1
socket create success!
bind success!
listening...
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo implementieren Sie mehrere Clients, um über einen Linux-Socket eine Verbindung zum Server herzustellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Repo: Wie man Teamkollegen wiederbelebt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Deepseek Web Version Eingang Deepseek Offizielle Website Eingang Deepseek Web Version Eingang Deepseek Offizielle Website Eingang Feb 19, 2025 pm 04:54 PM

Deepseek ist ein leistungsstarkes Intelligent -Such- und Analyse -Tool, das zwei Zugriffsmethoden bietet: Webversion und offizielle Website. Die Webversion ist bequem und effizient und kann ohne Installation verwendet werden. Unabhängig davon, ob Einzelpersonen oder Unternehmensnutzer, können sie massive Daten über Deepseek problemlos erhalten und analysieren, um die Arbeitseffizienz zu verbessern, die Entscheidungsfindung zu unterstützen und Innovationen zu fördern.

So installieren Sie Deepseek So installieren Sie Deepseek Feb 19, 2025 pm 05:48 PM

Es gibt viele Möglichkeiten, Deepseek zu installieren, einschließlich: kompilieren Sie von Quelle (für erfahrene Entwickler) mit vorberechtigten Paketen (für Windows -Benutzer) mit Docker -Containern (für bequem am besten, um die Kompatibilität nicht zu sorgen), unabhängig von der Methode, die Sie auswählen, bitte lesen Die offiziellen Dokumente vorbereiten sie sorgfältig und bereiten sie voll und ganz vor, um unnötige Schwierigkeiten zu vermeiden.

Ouyi OKX Installationspaket ist direkt enthalten Ouyi OKX Installationspaket ist direkt enthalten Feb 21, 2025 pm 08:00 PM

Ouyi Okx, die weltweit führende digitale Asset Exchange, hat jetzt ein offizielles Installationspaket gestartet, um ein sicheres und bequemes Handelserlebnis zu bieten. Auf das OKX -Installationspaket von Ouyi muss nicht über einen Browser zugegriffen werden. Der Installationsprozess ist einfach und einfach zu verstehen.

Bitget Offizielle Website -Installation (2025 Anfängerhandbuch) Bitget Offizielle Website -Installation (2025 Anfängerhandbuch) Feb 21, 2025 pm 08:42 PM

Bitget ist eine Kryptowährungsbörse, die eine Vielzahl von Handelsdienstleistungen anbietet, darunter Spot -Handel, Vertragshandel und Derivate. Der 2018 gegründete Austausch hat seinen Hauptsitz in Singapur und verpflichtet sich, den Benutzern eine sichere und zuverlässige Handelsplattform zu bieten. Bitget bietet eine Vielzahl von Handelspaaren, einschließlich BTC/USDT, ETH/USDT und XRP/USDT. Darüber hinaus hat der Austausch einen Ruf für Sicherheit und Liquidität und bietet eine Vielzahl von Funktionen wie Premium -Bestellarten, gehebelter Handel und Kundenunterstützung rund um die Uhr.

Holen Sie sich das Installationspaket Gate.io kostenlos Holen Sie sich das Installationspaket Gate.io kostenlos Feb 21, 2025 pm 08:21 PM

Gate.io ist ein beliebter Kryptowährungsaustausch, den Benutzer verwenden können, indem sie sein Installationspaket herunterladen und auf ihren Geräten installieren. Die Schritte zum Abholen des Installationspakets sind wie folgt: Besuchen Sie die offizielle Website von Gate.io, klicken Sie auf "Download", wählen Sie das entsprechende Betriebssystem (Windows, Mac oder Linux) und laden Sie das Installationspaket auf Ihren Computer herunter. Es wird empfohlen, die Antiviren -Software oder -Firewall während der Installation vorübergehend zu deaktivieren, um eine reibungslose Installation zu gewährleisten. Nach Abschluss muss der Benutzer ein Gate.io -Konto erstellen, um es zu verwenden.

Ouyi Exchange Download Official Portal Ouyi Exchange Download Official Portal Feb 21, 2025 pm 07:51 PM

Ouyi, auch bekannt als OKX, ist eine weltweit führende Kryptowährungsplattform. Der Artikel enthält ein Download -Portal für das offizielle Installationspaket von Ouyi, mit dem Benutzer den Ouyi -Client auf verschiedenen Geräten installiert werden können. Dieses Installationspaket unterstützt Windows, Mac, Android und iOS -Systeme. Nach Abschluss der Installation können sich Benutzer registrieren oder sich beim Ouyi -Konto anmelden, Kryptowährungen mit dem Handel mit den von der Plattform erbrachten Diensten anmelden.

Gate.io Official Website Registration Installation Paket Link Gate.io Official Website Registration Installation Paket Link Feb 21, 2025 pm 08:15 PM

Gate.io ist eine hochgelobte Kryptowährungshandelsplattform, die für ihre umfangreiche Token-Auswahl, niedrige Transaktionsgebühren und eine benutzerfreundliche Schnittstelle bekannt ist. Mit seinen fortschrittlichen Sicherheitsfunktionen und dem hervorragenden Kundenservice bietet Gate.io Händlern ein zuverlässiges und bequemes Handelsumfeld für Kryptowährung. Wenn Sie sich mit gate.io anschließen möchten, klicken Sie bitte auf den Link zum Herunterladen des offiziellen Registrierungsinstallationspakets, um Ihre Kryptowährungshandelsreise zu starten.

Warum tritt bei der Installation einer Erweiterung mit PECL in einer Docker -Umgebung ein Fehler auf? Wie löst ich es? Warum tritt bei der Installation einer Erweiterung mit PECL in einer Docker -Umgebung ein Fehler auf? Wie löst ich es? Apr 01, 2025 pm 03:06 PM

Ursachen und Lösungen für Fehler Bei der Verwendung von PECL zur Installation von Erweiterungen in der Docker -Umgebung, wenn die Docker -Umgebung verwendet wird, begegnen wir häufig auf einige Kopfschmerzen ...

See all articles