【问题标题】: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 位,我遇到了意想不到的结果。似乎这些位被缠绕或覆盖。

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

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

【问题讨论】:

    标签: c++ c windows sockets network-programming


    【解决方案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 中工作。

      【讨论】:

        猜你喜欢
        • 2011-01-13
        • 1970-01-01
        • 2021-01-05
        • 1970-01-01
        • 1970-01-01
        • 2012-05-18
        • 1970-01-01
        • 1970-01-01
        • 2017-07-14
        相关资源
        最近更新 更多