在套接字编程中,read()和recv(),以及send()和write()在性能、速度和其他行为方面有什么不同?
当前回答
recv()和read()之间的唯一区别是是否存在标志。使用零标志参数,recv()通常等效于read()
其他回答
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().
根据谷歌的第一次点击
Read()等效于带有flags参数为0的recv()。flags参数的其他值会改变recv()的行为。类似地,write()等价于带有flags == 0的send()。
“性能和速度”?那些不是…同义词,在这里吗?
无论如何,recv()调用接受read()不接受的标志,这使得它更强大,或者至少更方便。这是一个不同之处。我不认为有显著的性能差异,但还没有进行测试。
linux上的另一件事是:
Send不允许对非套接字fd进行操作。因此,例如在usb端口上写入,写入是必要的。
区别在于recv()/send()只作用于套接字描述符,并允许您为实际操作指定某些选项。这些函数稍微专业化一些(例如,您可以设置一个标志来忽略SIGPIPE,或者发送带外消息……)。
函数read()/write()是适用于所有描述符的通用文件描述符函数。
推荐文章
- 如何生成一个核心转储在Linux上的分段错误?
- 在Python中如何在Linux和Windows中使用“/”(目录分隔符)?
- 使用sh shell比较字符串
- 为什么函数指针定义可以使用任意数量的&号或星号* ?
- 什么是可重入函数?
- 如何在C中将数组初始化为0 ?
- Typedef定长数组
- 只列出UNIX中的目录
- 在C语言中通过引用传递
- sizeof(某个指针)总是等于4吗?
- 为什么星号在变量名之前,而不是在类型之后?
- 如何限制从grep返回的结果的数量?
- 何时使用内联函数,何时不使用它?
- 如何管道列表的文件返回的找到命令到猫查看所有文件
- 以相对于当前目录的路径递归地在Linux CLI中列出文件