Spülen der Socket-Streams in der C-Socket-Programmierung

8

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-

%Vor%

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.

%Vor%

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.

    
MohamedSanaulla 31.01.2010, 11:04
quelle

5 Antworten

3

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.

Bearbeiten:

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.

    
Nikolai Fetissov 01.02.2010, 14:31
quelle
4

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?

    
Tony The Lion 31.01.2010 11:16
quelle
2

benutze einfach fdopen. In Linux ist alles eine Datei. zB.

%Vor%     
Axel Ernesto Axel 04.09.2013 23:55
quelle
1

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.

    
Timothy Baldwin 21.08.2011 12:21
quelle
0

socket-unix-faq sagt, dass man Sockets nicht löschen kann

    
Alexander Farber 05.02.2010 15:33
quelle

Tags und Links