Spielen Sie mit der Connect-Funktion mit Timeout in Linux

Spielen Sie mit der Connect-Funktion mit Timeout in Linux

Im vorherigen Artikel haben wir mit Timeouts unter Windows gespielt. In diesem Artikel spielen wir mit Linux. Diese Frage ist mir in einem Interview begegnet, was interessant ist.

Direkt im Clientcode:

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <zeit.h>
int main(int argc, char *argv[]) // Achte auf die Eingabeparameter, bringe IP und Port mit
{
  int sockClient = socket(AF_INET, SOCK_STREAM, 0);
  Struktur sockaddr_in addrSrv;
  addrSrv.sin_addr.s_addr = inet_addr(argv[1]);
  addrSrv.sin_family = AF_INET;
  addrSrv.sin_port = htons(atoi(argv[2]));
 fcntl(sockClient, F_SETFL, fcntl(sockClient, F_GETFL, 0)|O_NONBLOCK); 
  int iRet = verbinden(sockClient, (const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));
 printf("connect iRet is %d, errmsg:%s\n", iRet, strerror(errno)); // Die Rückgabe von -1 ist nicht unbedingt eine Ausnahme, wenn (iRet != 0) 
 { 
   if (errno != EINPROGRESS)
 {
  printf("Verbindungsfehler: %s\n", strerror(errno)); 
 }
   anders 
 {
  Struktur timeval tm = {5, 0}; 
  fd_set wset, rset; 
  FD_ZERO(&wset); 
  FD_ZERO(&rset); 
  FD_SET(sockClient, &wset); 
  FD_SET(sockClient, &rset); 
  int Zeit1 = Zeit(NULL);
  int n = Auswahl(sockClient + 1, &rset, &wset, NULL, &tm); 
  int Zeit2 = Zeit(NULL);
  printf("Zeitlücke ist %d\n", Zeit2 - Zeit1);
  wenn(n < 0) 
  { 
   printf("Auswahlfehler, n ist %d\n", n); 
  } 
  sonst wenn (n == 0) 
  { 
   printf("Verbindungs-Timeout\n"); 
  } 
  sonst wenn (n == 1) 
  {
   wenn(FD_ISSET(sockClient, &wset)) 
   { 
    printf("Verbindung ok!\n"); 
    fcntl(sockClient, F_SETFL, fcntl(sockClient, F_GETFL, 0) & ~O_NONBLOCK); 
   } 
   anders 
   { 
    printf("unbekannter Fehler:%s\n", strerror(errno)); 
   } 
  }
  anders
  {
  printf("oh, ist jetzt egal, n ist %d\n", n);
  }
 } 
 } 
 printf("Ich bin hier!\n");
  getchar();
  schließen(sockClient);
  gebe 0 zurück;
}

Da wir den Servercode bereits viele Male geschrieben haben, werden wir in diesem Artikel nicht darauf eingehen.

Nach dem Testen ist das obige Programm in Ordnung. Sie können auch viel lernen, indem Sie tcpdump zum Erfassen von Paketen verwenden, z. B. erneute Übertragung von SYN-Paketen, RST-Paketen usw. Ziemlich interessant.

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Wenn Sie mehr darüber erfahren möchten, schauen Sie sich bitte die folgenden Links an

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung der Lösung für npm ls-Fehler, die durch das fsevents-Modul unter Linux verursacht werden
  • Erläuterung der Installation und Konfiguration zum Erstellen einer Go-Umgebung unter Linux
  • Zusammenfassung der Verwendung des Linux-Befehls „cut“
  • Detaillierte Erläuterung der Ein- und Ausgabeverwaltung des Linux-Systems und der allgemeinen Funktionen von vim
  • Linux-Shell - Beispiel zum Testen von Dateisystemattributen durch Identifizierung
  • Verschiedene Beurteilungen von if in der Linux-Shell
  • Erklärung zur Verwendung von Pushd, Popd und Dirs in der Linux-Shell
  • So drucken Sie Schriftarten und Hintergründe in verschiedenen Farben in der Linux-Shell-Konsole
  • Zeigen Sie die abhängigen Bibliotheken von so oder ausführbaren Programmen unter Linux an
  • Beispielerklärung der Alarmfunktion in Linux

<<:  Erläuterung der grundlegenden Syntax gespeicherter Prozeduren in der MySQL-Datenbank

>>:  Konfigurieren von MySQL und Squel Pro auf dem Mac

Artikel empfehlen

Tutorial: Nginx-Reverse-Proxy-Konfiguration zum Entfernen von Präfixen

Wenn Sie nginx als Reverse-Proxy verwenden, könne...

Wie versteht JS Daten-URLs?

Inhaltsverzeichnis Überblick Erste Schritte mit D...

Detaillierte Erklärung der Speicher-Engine in MySQL

Übersicht über die MySQL-Speicher-Engine Was ist ...

Verwendung des Linux-SFTP-Befehls

Konzept von SFTP sftp ist die Abkürzung für Secur...

Detaillierte Erklärung des Unterschieds zwischen run/cmd/entrypoint in Docker

In Dockerfile können run, cmd und entrypoint zum ...

Vorgehensweise bei der Installation einer virtuellen VMware Workstation-Maschine

Virtuelle Maschinen sind eine sehr praktische Tes...

jQuery ermöglicht nahtloses Scrollen von Tabellen

In diesem Artikelbeispiel wird der spezifische Co...

Erste Schritte mit MySQL - Konzepte

1. Was ist das? MySQL ist das beliebteste relatio...

Grafisches Tutorial zur Installation und Konfiguration von MySQL (CentOS7)

1. Systemumgebung [root@localhost-Startseite]# ca...

Detaillierte Erklärung des Unterschieds zwischen in und exists in MySQL

1. Bereiten Sie sich im Voraus vor Zu Ihrer Beque...

Mysql behält den vorhandenen Inhalt bei und fügt später Inhalte hinzu

Dieser Befehl ändert die Datentabelle ff_vod und ...

Detaillierte Prozessanalyse der Docker-Bereitstellung des Snail-Cinema-Systems

Umwelterklärung Host-Betriebssystem: Cetnos7.9 Mi...

Detaillierte Analyse des Reaktionsprinzips und der bidirektionalen Daten von Vue

Verstehen von object.defineProperty, um Reaktions...

Zusammenfassung der MySQL-Ansichtsprinzipien und Anwendungsbeispiele

Dieser Artikel fasst die Prinzipien und die Verwe...