2016-07-12 10 views
-2

Normalerweise wird beim Senden von beliebig großen Paketen ein Maximum festgelegt und als die Größe Ihres Empfangspuffers verwendet.Erhalten Sie die tatsächliche Größe des empfangenen Pakets

#include <winsock2.h> 

// Socket Description 
// Hint.ai_family = AF_INET; 
// Hint.ai_socktype = SOCK_DGRAM; 
// Hint.ai_protocol = IPPROTO_UDP; 

void Send(int Size) 
{ 
    char *Data = (char *)malloc(Size); 
    sendto(Socket, Data, Size, NULL, Result->ai_addr, Result->ai_addrlen) 
} 

void Receive() 
{ 
    const unsigned int MaxDataSize = 1436; 
    char *Data = (char *)malloc(MaxDataSize); 
    recvfrom(Socket, Data, MaxDataSize, 0, (SOCKADDR*)&RecvAddr, &RecvAddrSize); 
} 

In diesem Pseudo-Beispiel, unabhängig von der Größe der Daten zu Send() vergangen, unsere Receive() Funktion wird es immer mit der maximalen Größe definiert.

Wie kann man die ursprüngliche Größe der gesendeten Pakete feststellen?

+0

Sie müssen mehr Kontext bereitstellen, wie welche Art von Socket ist es? Wie groß sind die Daten, die Sie senden? Und überprüfen Sie das Ergebnis von 'sendto' und' recvfrom'? Außerdem hat dies nichts mit C++ zu tun (oder Sie würden 'new' anstelle von' malloc' verwenden), also aktualisieren Sie bitte die Tags. Tag Spamming ist verpönt. –

+3

Haben Sie in Betracht gezogen, die [* man * Seite für * recvfrom() *] (http://linux.die.net/man/2/recvfrom) zu konsultieren? – EJP

+2

'recvfrom' gibt die Größe des Pakets zurück ... – immibis

Antwort

0

MSDN recvfrom() Documentation

Wenn kein Fehler auftritt, kehrt recvfrom die Anzahl der empfangenen Bytes. Wenn die Verbindung ordnungsgemäß geschlossen wurde, ist der Rückgabewert Null. Andernfalls wird der Wert SOCKET_ERROR zurückgegeben und ein bestimmter Fehlercode kann durch Aufrufen von WSAGetLastError abgerufen werden.

Anschließend wird durch die Verwendung des MSG_PEEK Flag:

Peeks an den ankommenden Daten. Die Daten werden in den Puffer kopiert, aber wird nicht aus der Eingabewarteschlange entfernt. Die Funktion gibt anschließend die Menge der Daten, die in einem einzelnen Anruf gelesen werden können, an die recvfrom (oder recv) -Funktion, die nicht identisch sein kann mit der Gesamtmenge von Daten am Socket eingereiht. Die Datenmenge, die in einem einzelnen Aufruf der Funktion recvfrom (oder recv) gelesen werden kann, ist auf der im send- oder sendto-Funktionsaufruf geschriebenen Datengröße beschränkt.

Dies gibt Ihnen die Flexibilität, ein eingehendes Paket in mehreren Bursts zu lesen. Sie können einen Größenwert an den Anfang eines Pakets anhängen, bevor Sie es senden. Dies erscheint jedoch nicht so trivial wie es sich anhört.

Ich stelle irgendwelche Leistungsgewinne in Frage, wenn ich diese Route gehe, anstatt einfach genug Speicher zuzuweisen, um das größte Paket zu speichern, das du jemals senden wirst.

+0

Ihre Frage lautete: "Wie kann man die ursprünglich gesendete Paketgröße ermitteln?". Dies hat nichts mit der Größe des Empfangspuffers zu tun; Du hast den Punkt verpasst. Sie können dem Empfänger nicht sagen, nur den Empfangspuffer aufzufüllen oder das ganze Paket zu lesen, was auch immer das bedeutet. Sie * müssen * das eingehende Paket in mehreren Bursts lesen, Punkt. Die Größe des Empfangspuffers ist kein Problem. – EML

+1

@EML: Was Sie sagen, ist wahr für TCP, aber nicht für UDP. UDP bewahrt Nachrichtengrenzen, wobei ein einzelner Aufruf von 'sendto()' (oder ein verbundenes 'send()') eine vollständige Nachricht und einen einzelnen Aufruf an 'recvfrom()' (oder ein verbundenes 'recv()') sendet liest eine vollständige Nachricht und gibt ihre volle Größe zurück.Wenn der Puffer nicht groß genug ist, um die vollständige Nachricht in einem einzelnen Lesevorgang zu empfangen, wird ein "WSAEMSGSIZE" -Fehler gemeldet, und die Nachricht ist verloren, es sei denn, "MSG_PEEK" wird verwendet. Es ist nicht notwendig, die tatsächliche Nachrichtenlänge in die Nutzdaten einer UDP-Nachricht einzubetten, außer vielleicht für die Integritätsprüfung. –

+0

@Remy - Ich habe den UDP/DGRAM Kommentar nicht bemerkt - Danke - Antwort zurückgezogen. – EML

Verwandte Themen