在套接字编程中,read()和recv(),以及send()和write()在性能、速度和其他行为方面有什么不同?


当前回答

I just noticed recently that when I used write() on a socket in Windows, it almost works (the FD passed to write() isn't the same as the one passed to send(); I used _open_osfhandle() to get the FD to pass to write()). However, it didn't work when I tried to send binary data that included character 10. write() somewhere inserted character 13 before this. Changing it to send() with a flags parameter of 0 fixed that problem. read() could have the reverse problem if 13-10 are consecutive in the binary data, but I haven't tested it. But that appears to be another possible difference between send() and write().

其他回答

recv()和read()之间的唯一区别是是否存在标志。使用零标志参数,recv()通常等效于read()

区别在于recv()/send()只作用于套接字描述符,并允许您为实际操作指定某些选项。这些函数稍微专业化一些(例如,您可以设置一个标志来忽略SIGPIPE,或者发送带外消息……)。

函数read()/write()是适用于所有描述符的通用文件描述符函数。

linux上的另一件事是:

Send不允许对非套接字fd进行操作。因此,例如在usb端口上写入,写入是必要的。

Read()和write()更通用,它们适用于任何文件描述符。 但是,它们不能在Windows上运行。

您可以将其他选项传递给send()和recv(),因此在某些情况下可能必须使用它们。

I just noticed recently that when I used write() on a socket in Windows, it almost works (the FD passed to write() isn't the same as the one passed to send(); I used _open_osfhandle() to get the FD to pass to write()). However, it didn't work when I tried to send binary data that included character 10. write() somewhere inserted character 13 before this. Changing it to send() with a flags parameter of 0 fixed that problem. read() could have the reverse problem if 13-10 are consecutive in the binary data, but I haven't tested it. But that appears to be another possible difference between send() and write().