readv()、writev()、WSARecv()、WSASend()

Posted

技术标签:

【中文标题】readv()、writev()、WSARecv()、WSASend()【英文标题】:readv(), writev(), WSARecv(), WSASend() 【发布时间】:2009-04-02 09:31:51 【问题描述】:

我希望你能帮助我。

我正在尝试通过 TCP/IP 通过网络发送 1000 位的数据包,我希望能够在 Cygwin 和 Windows 中使用重叠 I/O 技术。

在 Cygwin 中,我尝试使用“readv() 和 writev()”函数调用来发送 1000 位,而在 Windows 中,我尝试使用 winsock2 中的 WSASend() 和 WSARecv() API。 h头文件。

看来我只能将 1000 位从 Cygwin(client.cpp) 发送到 Windows(server.cpp)。超过 1000 位,我遇到了意想不到的结果。似乎这些位被缠绕或覆盖。

我已经在整个互联网上进行了搜索,但似乎没有人像我一样尝试过使用这种方法来处理事情,因此我正在寻求您的帮助。

谢谢你和最好的问候, 科尼利厄斯

【问题讨论】:

【参考方案1】:

如果您想在 Windows 上使用重叠 I/O,那么您可能想看看我在 The Code Project 上写的一些文章,这些文章可能会为您提供一个起点。它们使用 IO 完成端口,这是在 Windows 上进行重叠 I/O 的最有效方式,并附带完整的源代码。有文章链接和最新出处here。

根据您对问题的简短描述,很难准确判断可能出了什么问题。您很可能假设您的读取将读取您正在写入的相同数量的数据,而 TCP 并非如此。 TCP 是一个字节流,您的读取需要考虑到这一点并相应地循环,直到您重新组装一个完整的“消息”。

【讨论】:

【参考方案2】:

你的问题很不清楚,你需要澄清一下。这里有一些想法,仍然:

使用 TCP 发送“数据包”不是一个好主意。 TCP 的数据模型是字节流。 您确定您的意思是 1000 位,而不是 1000 字节? 您需要澄清“意外结果”的含义,它非常模糊。 Overlapped I/O 似乎是一种特定于 Windows 的异步 I/O 技术,我不希望它在 Cygwin 中工作。

【讨论】:

以上是关于readv()、writev()、WSARecv()、WSASend()的主要内容,如果未能解决你的问题,请参考以下文章

readv和writev函数

readv函数和writev函数

Linux:何时使用分散/收集 IO(readv、writev)与带有 fread 的大缓冲区

c_cpp writev_readv.c

套接字I/O函数write/read writev/readv send/recv sendto/recvfrom sendmsg/recvmsg

FastCFS POSIX API简介