1

こんにちは 私はネットワーク プロジェクトに取り組んでいます。着信データをリッスンしているソケットがあります。これをアーカイブしたいと思います: ソケットは 100 パケットしか受信しません。そして、3〜4人のクライアントがいます。ランダムなデータ パケットを無限に送信しています。100 パケットを受け取り、後で処理します。手続き後、受け取りを再開します。しかし現時点では、保留中の send() >> recv() 操作がいくつかあります。ここで、保留中の recv 操作をキャンセル/破棄したいと考えています。データを受信し、処理しないと思います。他の提案はありますか?(質問構成が悪くてすみません)

4

3 に答える 3

4

シャットダウンして接続を閉じます。それはすぐにすべてをキャンセルします。

さらに良いのは、アプリケーションとネットワーク プロトコルを再設計して、受信するデータ量を確実に判断できるようにすることです。

Windows では、CancelIO を使用して未処理の受信をキャンセルできますが、受信がたまたま何かを読み取った場合、データが失われる可能性があります。

于 2013-10-13T08:23:10.623 に答える
1

select()またはpoll()ループを使用できます。信号を使用できます。recv()はシグナルを受信するとリターンするので、別のタスクから でブロックしているタスクにシグナルを送ることができますrecv()。ただし、指定しないようにする必要がありますSA_RESTART( http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.htmlを参照) 。

詳細については、 http://en.wikipedia.org/wiki/Asynchronous_I/Oを参照してください

于 2013-10-13T10:59:08.257 に答える