UDPを使用してパケットを送信しようとしています。チャネルが空いていない場合、パケットは送信されないことを私は知っています。QTを使用しudpSocket->writeDatagram
てUDPパケットを送信しています。私はループでそれを行っています。前のパケットが送信される前に別のパケットを送信しないようにしたいのです。フラグ、またはパケットが送信されていることを確認するためのその他の方法はありますか?
3 に答える
UDPは、設計上、信頼性の低いプロトコルです。パケットが失われないことを保証するものではなく、パケットが失われた場合、送信者にはそのことが通知されません。したがって、UDPパケットが相手側で正常に受信されたかどうかを知ることはできません。
もちろん、アプリケーションレベルのプロトコルが特定の応答を送信しない限り。ただし、応答は簡単に失われる可能性があるため、応答がないからといって、パケットが受信されなかったという明確な証拠にはなりません。
ドキュメントによると:
サイズサイズのデータのデータグラムをポートポートのホストアドレスアドレスに送信します。成功時に送信されたバイト数を返します。それ以外の場合は-1を返します。
したがって、それがあなた以外のものを返す場合、それは-1
「送信された」と見なすことができます。ただし、本当に知りたいのが反対側に到達したかどうかである場合は、ピアからの連絡が必要になります。
通常、UDPパケットをできるだけ速く(ただし速くはしない)送信するには、ソケットを非ブロッキングモードにしてから、send()/ sendto()が-1/EAGAINを返すまでパケットをループで送信する必要があります。 (別名EWOULDBLOCK)。その結果コードが返されたら、send-loopループから抜け出し、ソケットが再び書き込み可能になるのを待ちます。Qtの下で、QSocketNotifierオブジェクトを設定でき(ソケットを設定した直後に)、ソケットに送信データ用のスペースがあるときはいつでも、アクティブ化された(int)信号を送信します。その信号を受信すると、さらにいくつかのパケットを送信できます。