C sendmsg() kein Pufferspeicher verfügbar
Ich bin kein Experte in C-Programmierung, aber ich bin versucht, zu schreiben, eine ziemlich einfache Programm mit sendmsg() und recvmsg() zum senden einer Nachricht zwischen einem client und einem server (beide sind auf der gleichen Maschine, also im Grunde ich ' m senden Sie eine Nachricht an localhost).
Nach der Initialisierung der benötigten Strukturen (wie in der iovec und die msghdr) und den erfolgreichen verbinden des Clients mit dem server, meine sendmsg () - Aufruf schlägt fehl mit "kein Pufferspeicher verfügbar" errno.
Dies ist, was linux-Mann-Berichte über diese Art von Fehler:
Die Ausgabe-Warteschlange eines Netzwerk-interface voll war. Dies weist im Allgemeinen darauf hin, dass die Schnittstelle hat aufgehört, aber vielleicht verursacht durch vorübergehende Verkehrsbehinderungen. (Normalerweise tritt dies nicht in Linux. Pakete werden nur im hintergrund gelöscht, wenn ein Gerät Warteschlange überläuft.)
Ich schaute mich im Internet um und als Ergebnis fand ich heraus, dass sendmsg() ist nicht weit verbreitet, und niemand könnte sich mit dieser Art von Fehler. Der einzige nützliche Rat, den ich fand, war zu überprüfen, eine eventuelle überschreitung des sockets öffnen, aber wieder habe ich das immer in der Nähe JEDER Steckdose, die ich erstellen.
So, ich bin stecken, im Grunde, weil Sie ziemlich der noob ich weiß nicht genau, wo Sie suchen zu lösen diese Art von problem.
Wenn jemand weiß, wie es weitergehen soll, wäre es toll.
(Und bitte nicht mir sagen, nicht zu verwenden sendmsg(), weil der ganze Zweck meiner Arbeit ist es, zu verstehen, dieser Systemaufruf, und nicht das senden einer Nachricht an mich)
Hier ist der code, den ich geschrieben habe, die bisher auf pastebin: client und server
--GELÖST--
Danke Ihnen sehr. Ich habe in der Lage, das problem zu lösen und ich behoben, die anderen Fehler die ich gemacht habe, also hier ist der funktionierende code für sendmsg() und recvmsg() arbeiten message-passing: Client und Server
- Ist dies für TCP-oder UDP?
- - oder unix-domain (oder socketpair)?
- Du meinst die
ENOBUFS
Fehler, richtig? Nun, das ist in der Tat merkwürdig. Können Sie ein minimal-test-Fall, wo es passiert, also jemand anderes kann versuchen Reproduktion? - Ich benutze einen verbindungsorientierten AF_INET-socket (type SOCK_STREAM), also TCP.
- Bitte zeigen Sie einige code.
- Hier ist, was ich bisher getan habe: - client --> link server --> link Es ist wirklich basic-code, aber wie gesagt ich bin eher der noob.
- Bitte beachten Sie, wie schnell Sie bekam Antworten, sobald Sie zeigte Ihren code. Fühlen Sie sich frei, um Schlussfolgerungen zu ziehen in Bezug auf den relativen Wert von a) sprechen Beschreibung von code, und b) die eigentliche code. Vor allem, wenn es bekannt ist, dass der code ein oder mehrere Fehler sind ...
- Sorry, aber es ist auch das erste mal, dass ich eine Frage stellen online. Ich werde es mir merken beim nächsten mal. Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie andere haben darauf hingewiesen, iovlen sollte 1 sein. Aber auch, Sie wollen zu null aus mh, bevor Sie initialisiert einige der Felder da hast du wohl Einsenden Müll in den nicht initialisierten Felder und die syscall verwechselt wird. Auch, es nicht wirklich Sinn macht msg_name und msg_namelen da sind Sie verbunden und können nicht Ihre Meinung ändern, wo die Daten zu senden, sowieso.
Dies ist, was funktioniert für mich, in Ihrem client-code:
memset
Strukturen, sondern explizit initialisiert Mitglieder. Mitmemset
macht eine Annahme über die binäre Darstellung von Werten, die möglicherweise nicht immer zutreffend.Den
msg_iovlen
Feld enthält die Anzahl der Elemente in der iov array, nicht dessen Größe in bytes.Das system interpretiert die folgenden nicht-initialisierten Speicher als iov Elemente, endete mit einem Paket, das größer ist als der socket-Puffer-Raum zur Verfügung, und so weigerten sich, Daten zu senden.
Okay, also in deinem code habe ich gefunden:
Setzt
msg_iovlen
Mitglied, um die Größe derstruct iovec
. Aber die Dokumentation sagt über dieses Feld:Also dein code ist falsch, es sagt
sendmsg()
dass es geht, zu senden, die weit mehr Elemente, als Sie tatsächlich initialisieren.