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:
|
<<: Erläuterung der grundlegenden Syntax gespeicherter Prozeduren in der MySQL-Datenbank
>>: Konfigurieren von MySQL und Squel Pro auf dem Mac
Wenn Sie nginx als Reverse-Proxy verwenden, könne...
Inhaltsverzeichnis Überblick Erste Schritte mit D...
Übersicht über die MySQL-Speicher-Engine Was ist ...
Um zwei verschiedene Tabellen abzufragen, müssen ...
Konzept von SFTP sftp ist die Abkürzung für Secur...
In Dockerfile können run, cmd und entrypoint zum ...
Virtuelle Maschinen sind eine sehr praktische Tes...
In diesem Artikelbeispiel wird der spezifische Co...
1. Was ist das? MySQL ist das beliebteste relatio...
1. Systemumgebung [root@localhost-Startseite]# ca...
1. Bereiten Sie sich im Voraus vor Zu Ihrer Beque...
Dieser Befehl ändert die Datentabelle ff_vod und ...
Umwelterklärung Host-Betriebssystem: Cetnos7.9 Mi...
Verstehen von object.defineProperty, um Reaktions...
Dieser Artikel fasst die Prinzipien und die Verwe...