recvfrom WSAEMSGSIZE



  • Hi!
    Habe ein UDP Socket. Wenn eine Nachricht herein kommt, lese ich die mit recvfrom aus.

    Problem ist, es sind z. B. 13 Byte gesendet wurden, ich will aber nur immer 1 Byte auslesen(geht nicht anders). Also habe ich einen 1 Byte großen Buffer erstellt, und gebe bei Size halt 1 an.

    recvfrom liefert mir jedoch ein SOCKET_ERROR zurück, und WSAGetLastError() sagt mir dann WSAEMSGSIZE.

    A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram was smaller than the datagram itself.

    Also hier ist der Buffer kleiner als der Empfangsbuffer des Socket. Ich verstehe jedoch nicht warum das ein Fehler sein soll oO. Ich will halt nur 1 Byte von den 13 Byte aus dem Empfangsbuffer auslesen.

    Wie kann man das umgehen?

    mfg olli



  • WSAEMSGSIZE The message was too large to fit into the specified buffer and was truncated.



  • Ja, sie wird dann halt beschnitten, aber beim zweiten Aufruf von recvfrom, wo ich eigentlich dann das nächste Byte lesen will, kackt recvfrom ab.
    mfg olli



  • Das liegt wahrscheinlich daran, dass alles was du beim erstem Aufruf nicht gelesen hast abgeschnitten und gelöscht wird.

    MSDN schrieb:

    If the datagram or message is larger than the buffer specified, the buffer is filled with the first part of the datagram, and recvfrom generates the error WSAEMSGSIZE.

    Das kennen wir ja schon, aber...

    MSDN schrieb:

    For unreliable protocols (for example, UDP) the excess data is lost.



  • Ich habe den Thread nochmal ausgekramt, da es nun auch Fehler mit einen 1024 Byte großen Buffer gibt.

    Kann man den internen Buffer nicht irgendwie begrenzen?

    Ich habe es mit

    int Size = 1024;
    setsockopt(Socket, SOL_SOCKET, SO_RCVBUF, &Size, 4)
    

    probiert, WSAEMSGSIZE ist jedoch weiterhin der Fehlercode. Die Berkleysockets können doch nicht so scheiße designed sein, dass man einen meinetwegen 64K Buffer bereitstellen muss ?oder

    mfg olli



  • Der Empfangspuffer muss so gross sein wie eine MTU (maximum-transmission unit), normalerweise 1480 bytes (für lokale Netzwerke); 1400 für VPN und 1500 für PPP...



  • Danke, das Problem ist jedoch, das man anscheinend diese MTU ändern kann
    siehe http://www.winguides.com/registry/display.php/280/

    Habe mir mal mit gestockopt(Socket, SOL_SOCKET, SO_MAX_MSG_SIZE, ..., ...) die Größe des ?Receivebuffers? ausgeben lassen, und kam da auf 65507 Byte.

    Ich pers. würde es für pure Ressourcenverschwändung halten, wenn ich 64 KB für jeden Socket bereitstellen müsste.

    mfg olli



  • Ja, diese MTU kann man ändern...



  • Ich pers. würde es für pure Ressourcenverschwändung halten, wenn ich 64 KB für jeden Socket bereitstellen müsste.

    Klar, das soll lieber das OS machen und wenn möglich auch noch
    für jedes Paket einen eigenen Buffer allokieren.
    Vielleicht solltest Du mal in Richtung Speicherverschwendung und
    Fragmentierung denken. Berkley hat da Gott sei Dank etwas weiter
    gedacht als Du.


Anmelden zum Antworten