【问题标题】:Using "send" to tcp socket/Windows/c使用“发送”到 tcp socket/Windows/c
【发布时间】:2019-12-25 04:27:25
【问题描述】:

对于 c send 函数(阻塞方式),它指定了在目标接收到时返回的函数返回的发送字节大小。我不确定我是否理解所有细微差别,也是在服务器端使用WSAIoctlWSARecv 编写“演示”应用程序之后。

  1. 当发送返回的字节数少于缓冲区长度参数中要求的字节数时?
  2. 什么被认为是“在目的地收到”?我的第一个猜测是它位于服务器的操作系统缓冲区并通知服务器应用程序时。我的第二个是当服务器应用程序recv 调用完全阅读它时?

【问题讨论】:

    标签: sockets tcp


    【解决方案1】:

    除非您使用的是(有些奇特的)库,否则套接字上的 send 将返回成功传递到 TCP 缓冲区的字节数,而不是对等方接收到的字节数(例如,参见Microsoft´s docs)。

    当您通过套接字传输数据时,您需要检查有效接受到 TCP 发送缓冲区的字节。这就是为什么通常一个发送命令在一个循环中,如果需要,它将发出几个sends。

    send 中的错误是本地:例如,如果套接字在发送操作期间被对等方关闭(使您的套接字无效)或操作超时(TCP 缓冲区未清空,即对等方没有足够快地接收数据或其他一些问题)。

    在完成所有send 之后,您无法轻松知道对方是否收到了您发送的所有字节。您通常只需发出closesocket 并确保您的套接字具有正确的linger 选项集(即仅在超时或成功完成发送后关闭)。或者,您等待对等方的确认(例如通过返回零字节的recv,表明连接已正常关闭)。

    编辑:错字

    【讨论】:

    • 我相信大多数情况下不需要使用lingerclose调用已经在等待数据完全发送到peer;此外,AFAIK 如果发生延迟超时,则会向对等方发送一个 RESET,这通常是不好的
    猜你喜欢
    • 2017-09-04
    • 2012-05-26
    • 2018-01-31
    • 2015-09-03
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多