2012-04-09 4 views
0

ich weiß, daß die Größe des UDP-Pakets, um herauszufinden, vor dem Lesen Sie diese syscall zum Kernel ausgeben kann:wissen udp Paketgröße mit Umfrage wählen oder epoll

ioctl(s,FIONREAD,&num_bytes); 

Aber kann ich das gleiche erfahren mit einem der folgenden syscalls?

Der Schlüssel ist, die Größe des Datagramms vor dem Lesen zu kennen, um Speicherplatz für den Puffer zuzuweisen. Dies ist nur für Linux, in C.

+2

verwenden Ich bin ziemlich sicher, 'recvfrom' hat eine' MSG_PEEK' Flag, die Sie verwenden können, um die Anzahl der Bytes in dem Paket abzufragen (Vorschau seines Inhalts ohne es zu entfernen die Warteschlange), die viel portabler wäre als hässliche 'ioctl'-Lösungen ... :-) –

+0

Max. UDP-Datagrammgröße ist 64K, aber erhalten Sie jemals UDP-Nachrichten größer als 1472 Bytes? Welches Protokoll ist das? –

+0

@R. Danke R, guter Tipp. Was ich suchte, ist das Speichern von Syscalls, wenn einige der erwähnten 3 Syscalls mir die Größe des verfügbaren Pakets geben könnten (neben der Benachrichtigung, dass Daten über den zu lesenden Deskriptor verfügbar sind), wäre das sehr hilfreich bei der Geschwindigkeit up den Code (weil ich eine der oben genannten 3 sowieso verwenden muss, wenn die Anwendung auf Eingabe wartet) – Nulik

Antwort

0

Das Multiplexing syscalls wie poll oder select sind eine Reihe von Bedingungen erwarten zu sehen (Eingang wie auf fd # 5 zur Verfügung steht, Ausgang ist möglich, auf fd # 7) und Sie sagt, welche Dateideskriptoren lesbar sind (und welche beschreibbar sind usw.). Sobald Sie wissen, welcher Dateideskriptor gelesen werden kann, können Sie Ihren ioctl(fd, FIONREAD, &numbytes) für diesen lesbaren Dateideskriptor fd verwenden. Also sollten Sie sowohl poll als auch ...

+0

Ich bin ziemlich sicher, dass Sie mit UDP erwarten können, dass ein einzelnes Paket mit einem einzigen "Lese" oder "Recv" Anruf empfangen wird, vorausgesetzt, Ihr Puffer ist groß genug. (Dies gilt natürlich nicht für TCP) –

+0

Das ist richtig. Die Sockets-Schnittstelle gibt nur vollständige Pakete zurück, keine Fragmente. – Perry

+0

Ich dachte, dass Router UDP-Paket fragmentieren dürfen. Ich entfernte den letzten Satz. –