2

これが私の最初のメッセージです。リアルタイムOS(OnTimeおよびVxWorks)でノンブロッキングUDPソケットを使用しています。ドキュメントといくつかのフォーラムを読みましたが、sendto()関数とrecvfrom()関数の「原子性」について疑問があります。

  • sendto()は、キューに入れられたバイト数またはエラーを返します。入力バッファの長さより短い可能性はありますか?たぶん、出力バッファに十分な空き領域がなく、ほんの数バイトがエンキューされています...

  • recvfrom()は、受信したバイト数またはエラーを返します。ソースが送信したメッセージのサイズよりも小さい可能性はありますか?私は部分的なメッセージの読み取りを意味します...

読み取りおよび書き込み関数がアトミック(完全なメッセージまたはメッセージの読み取り/書き込みなし)であることを願っています。

ありがとう。エマヌエーレ。


OnTimeのサポートを依頼したところ、出力バッファに十分な空き領域がない場合、sendto()が部分的なメッセージをキューに入れる可能性があると言われました。場合によっては、recvfrom()も部分的なメッセージを返すことができるかどうかはわかりません。異なるOS間でのソケット実装には標準的な動作はないと思います。

4

2 に答える 2

1

sendto()は、キューに入れられたバイト数またはエラーを返します。入力バッファの長さより短い可能性はありますか?

いいえ。UDPの場合は完全に送信されるか、まったく送信されません。

recvfrom()は、受信したバイト数またはエラーを返します。ソースが送信したメッセージのサイズよりも小さい可能性はありますか?私は部分的なメッセージの読み取りを意味します...

OSスタックのバッファがUDPパケット全体を保持できない場合、そのパケットはドロップされます。アプリケーションバッファがパケット全体を保持できない場合は、パケットの最初のコンテンツを取得します。

つまり、1つのケースで部分的なメッセージを読み取ることができます。つまり、sendto()に渡すバッファーにデータが収まらない場合です。その場合、残りのパケットは破棄されます。recvmsg()を使用すると、パケットが切り捨てられたかどうかを検出できますが、これは通常、最大サイズのバッファー(UDPはMTUが2 ^ 16-1のIPパケットに収まる必要があります)を使用するか、使用するプロトコルを設計することによって解決されます。独自の妥当な最大サイズを設定するUDP内。

于 2013-01-14T15:04:26.843 に答える
0

私はこれらのシステムにあまり詳しくありませんが、通常のUDPソケットセマンティクス(常に「送信」で完全なデータグラムをエンキューし、「受信」で完全な単一データグラムをデキューする)を破ると、非常に驚​​きます。

于 2013-01-14T15:06:42.763 に答える