windows - kigger på en UDP-besked i c ++

Indlæg af Hanne Mølgaard Plasc

Problem





Jeg forsøger at modtage en UDP-besked ved hjælp af stikkontakter i c ++.

Jeg sender beskedens størrelse i overskriften, så jeg kan vide, hvor meget hukommelse jeg skal tildele, så jeg prøver at kigge på beskeden af ​​meddelelsen som denne:


int bytesRead = recvfrom(m\_socketId, (char*)&header, Message::HeaderSize, MSG\_PEEK, (struct sockaddr *)&fromAddr, &addrSize);  


men jeg fortsætter med at få systemfejl 10040:



  'En besked sendt på en datagram socket
  var større end den interne besked
  buffer eller en anden netværksgrænse eller
  bufferen bruges til at modtage et datagram
  ind var mindre end datagrammet
  sig selv.'



Er der en måde at kigge bare ved at tigge budskabet?

tak :)

Bedste reference


I betragtning af at maksimumsstørrelsen på en UDP-pakke er 65507, kan du bare tildele en enkelt 64k 'bounce buffer' til alle dine recvfrom() opkald - når du har kopieret det, skal du læse størrelsen, tildele en ny buffer og lav en kopi af din pakke med nøjagtig den rigtige størrelse. [10]


Det er lidt spildt at kopiere pakkedata omkring så meget, men det ville lade dig allokere buffere i den rigtige størrelse.


Eller hvis du ved, at din peer aldrig vil generere pakker større end 8k på grund af arkitekturen i din ansøgning, kan du bare fordele 8k buffere og spilde rummet. At være opmærksom på brug af hukommelse er vigtigt, men nogle gange brænder kun en ekstra side til enklere kode.

Andre referencer 1


Du kan prøve WSARecvMsg(..., MSG\_PEEK). Du får fået MSG\_TRUNC -flagget i resultatet, men du skal også have de headerbytes, du bad om.

Andre referencer 2


Din kode er faktisk helt fint. Du skulle have læst beskrivelsen af ​​fejlkoden WSAEMSGSIZE (det er din 10040) på recvfrom. [11]



  Meddelelsen var for stor til at passe ind i bufferen påpeget af buf-parameteren og blev afkortet.



I dit tilfælde er fejlkoden WSAEMSGSIZE ikke rigtig en fejl, fordi du med vilje læser mindre end den fulde pakke. Du skal blot analysere dit overskrift og derefter læse hele pakken uden MSG\_PEEK for at fjerne pakken fra indgangskøen.