web-dev-qa-db-ja.com

read()とrecv()の違い、およびsend()とwrite()の違いは何ですか?

ソケットプログラミングにおけるread()とrecv()の違い、およびsend()とwrite()の違いは何ですか?パフォーマンスと速度、その他の動作。

174
Sajad Bahmani

違いは、recv()/send()はソケット記述子でのみ機能し、実際の操作に特定のオプションを指定できることです。これらの関数はわずかに特殊化されています(たとえば、SIGPIPEを無視するか、帯域外メッセージを送信するようにフラグを設定できます...)。

関数read()/write()は、すべての記述子で機能するユニバーサルファイル記述子関数です。

114
Gonzalo

Googleでの最初のヒット

read()は、flagsパラメーターが0のrecv()と同等です。flagsパラメーターの他の値は、recv()の動作を変更します。同様に、write()はflags == 0のsend()と同等です。

82

read()およびwrite()はより一般的であり、どのファイル記述子でも機能します。ただし、Windowsでは機能しません。

send()およびrecv()に追加のオプションを渡すことができるため、場合によってはそれらを使用する必要があります。

11

最近、Windowsのソケットでwrite()を使用したとき、ほとんど機能することに気付きました(write()に渡されたFDは、send()に渡されたFDと同じではありません。 _open_osfhandle()でFDをwrite()に渡します)。ただし、文字10を含むバイナリデータを送信しようとしても機能しませんでした。write()は、この前に文字13を挿入しました。 flagsパラメータを0にしてsend()に変更すると、その問題が修正されました。 read()は、バイナリデータで13-10が連続している場合、逆の問題が発生する可能性がありますが、テストしていません。しかし、それはsend()write()の別の可能な違いのようです。

7
ajb

Linuxでのもう1つのことは次のとおりです。

sendは、ソケット以外のfdでの操作を許可しません。したがって、たとえばusbポートに書き込むには、writeが必要です。

6
Mert Mertce

「パフォーマンスとスピード」?ここではそういう類義語ではないですか?

とにかく、recv()呼び出しはread()が受け取らないフラグを取ります。これにより、より強力になり、少なくともより便利になります。それが一つの違いです。パフォーマンスに大きな違いはないと思いますが、テストは行っていません。

3
unwind