ソケットプログラミングにおけるread()とrecv()の違い、およびsend()とwrite()の違いは何ですか?パフォーマンスと速度、その他の動作。
違いは、recv()
/send()
はソケット記述子でのみ機能し、実際の操作に特定のオプションを指定できることです。これらの関数はわずかに特殊化されています(たとえば、SIGPIPE
を無視するか、帯域外メッセージを送信するようにフラグを設定できます...)。
関数read()
/write()
は、すべての記述子で機能するユニバーサルファイル記述子関数です。
read()は、flagsパラメーターが0のrecv()と同等です。flagsパラメーターの他の値は、recv()の動作を変更します。同様に、write()はflags == 0のsend()と同等です。
read()
およびwrite()
はより一般的であり、どのファイル記述子でも機能します。ただし、Windowsでは機能しません。
send()
およびrecv()
に追加のオプションを渡すことができるため、場合によってはそれらを使用する必要があります。
最近、Windowsのソケットでwrite()
を使用したとき、ほとんど機能することに気付きました(write()
に渡されたFDは、send()
に渡されたFDと同じではありません。 _open_osfhandle()
でFDをwrite()
に渡します)。ただし、文字10を含むバイナリデータを送信しようとしても機能しませんでした。write()
は、この前に文字13を挿入しました。 flagsパラメータを0にしてsend()
に変更すると、その問題が修正されました。 read()
は、バイナリデータで13-10が連続している場合、逆の問題が発生する可能性がありますが、テストしていません。しかし、それはsend()
とwrite()
の別の可能な違いのようです。
Linuxでのもう1つのことは次のとおりです。
send
は、ソケット以外のfdでの操作を許可しません。したがって、たとえばusbポートに書き込むには、write
が必要です。
「パフォーマンスとスピード」?ここではそういう類義語ではないですか?
とにかく、recv()
呼び出しはread()
が受け取らないフラグを取ります。これにより、より強力になり、少なくともより便利になります。それが一つの違いです。パフォーマンスに大きな違いはないと思いますが、テストは行っていません。