Ich wollte wissen, wie man die Socket-Streams löscht, während man Socket-Programmierung in C vornimmt. Ich habe alle Optionen versucht - TCP_NODELAY
mit folgendem Code einstellen-
Hinweis: Alle flag
und sockfd
sind korrekt deklariert.
Ich habe diese Funktion sowohl vor send(
als auch nach send()
verwendet, aber es hat keinen Unterschied gemacht.
Auch jemand hat vorgeschlagen, shutdown()
nach jedem send()
zu verwenden, aber das funktioniert nur für eine Instanz. Wenn ich es benutze, um etwas Text erneut zu senden, funktioniert es nicht - tatsächlich wird die Verbindung geschlossen, nachdem ich shutdown()
benutzt habe.
Kann jemand in dieser Hinsicht helfen?
Ich wollte hinzufügen, dass der Server ein Java-Socket und der Client ein C-Socket ist. Der C-Socket implementiert die JVMTI-Schnittstelle und sendet die Informationen an den Java-Socket.
Vielleicht möchten Sie Die ultimative SO_LINGER-Seite, oder: Warum ist mein TCP nicht zuverlässig? , was meiner Meinung nach auf Ihre Situation zutrifft.
send()
mehrmals auf einem TCP-Socket aufzurufen, ist nicht ungewöhnlich :) Es ist normal, meine ich. Sie haben wahrscheinlich Probleme auf der Serverseite, wo der Server eine bestimmte Anzahl von Bytes erwartet und Blöcke darauf warten.
Soweit ich weiß, gibt JVM TI kein Over-the-Wire-Protokoll vor, also müssen Sie sich Ihr eigenes ausdenken. Definieren Sie die Struktur des Datensatzes, den der Client sendet und der Server erwartet, und geben Sie die Datenlänge ein, wenn die Größe variiert. Sie können auch eine Bestätigung auf Anwendungsebene vom Server zurück zum Client implementieren.
Wenn wir ein wenig über Google nachforschen, scheint es keinen Weg zu geben, einen Socket-Stream explizit zu löschen. Sie können den TCP_NODELAY setzen und dann den TCP Nagle-Algorithmus ausschalten. Dies sollte sicherstellen, dass die Daten sofort gesendet werden und nicht warten, bis der Puffer voll ist, bevor sie gesendet werden.
Haben Sie seit wireshark verwendet, um zu sehen, was hinter den Kulissen passiert, wenn Sie TCP_NODELAY setzen?
benutze einfach fdopen. In Linux ist alles eine Datei. zB.
%Vor%Sie können nicht explizit als Socket löschen, da die Daten immer so schnell wie möglich gesendet werden, wobei der verfügbare Pufferspeicher am Empfänger und die Notwendigkeit, eine Netzwerküberlastung zu vermeiden, berücksichtigt werden. Die Einstellung TCP_NODELAY erlaubt das Senden von Paketen, die kleiner als die maximale Größe sind, während noch offene Bestätigungen vorhanden sind.