【问题标题】:Socket programming send() return valueSocket编程send()返回值
【发布时间】:2013-01-19 23:43:48
【问题描述】:

在linux下,或者windows socket编程

我知道 read 返回一个值,该值指示 成功接收的字节数。

此返回值可能小于请求的长度。 (即 read(sd, buf, 100) 如果接收缓冲区可能返回 50 只有 50 个字节)

有没有可能

send(sd, buf, 100);

返回1~99之间的值?? 如果是,那是什么场合? 我想知道具体的例子情况。

提前谢谢你

【问题讨论】:

    标签: linux sockets networking


    【解决方案1】:

    有关官方规范,请参阅man 页面或 MSDN 文档(如果您正在谈论 Winsock)。

    实践中,send() 在阻塞模式下发送所有数据,不管文档说什么,除非出现错误,在这种情况下什么都不会发送。

    在非阻塞模式下,它发送适合套接字发送缓冲区的任何内容,如果 > 0,则返回该长度。如果套接字发送缓冲区已满,则返回 -1,错误号 = EWOULDBLOCK/EAGAIN

    【讨论】:

    • 谢谢,这正是我的假设。你确认了,谢谢
    • 我还没有测试过,但我想如果你通过阻塞 I/O 发送非常大的缓冲区(例如,每次 send() 调用超过 65KB),那么发送是可能的() 发送部分数据,然后遇到错误(例如远程对等端关闭了连接)。在那种情况下,我认为 send() 唯一有用的方式是返回发送的字节数,这将小于缓冲区大小。这在实践中并不经常发生,只是因为大多数程序不会尝试在一次调用中发送这么多数据。
    • @JeremyFriesner 根据规范可以。在实践中它不会发生,并不是因为“大多数程序不会尝试发送这么多数据”,而是因为 send() 在所有内核中都是这样实现的。
    • 嗯,好吧,如果 send() 发送了 200KB 的 800KB 缓冲区,然后接收应用程序关闭了它的套接字末端,它会做什么? send() 会在那个时候返回 0 并假装它没有成功发送任何东西吗?我想我得自己试试看……
    • 好的,我试过了(通过 TCP 发送一个 20MB 的缓冲区,通过单个 send() 调用将 20MB 缓冲区发送到 localhost 上的另一个程序),我验证了 EJP 是正确的——至少在 MacOS/X 10.8 下.2,无论有多少字节实际到达接收器,如果它无法发送整个缓冲区,阻塞 send() 仍将返回 -1。不是我实现它的方式,但它就是这样。 :P
    猜你喜欢
    • 2011-04-18
    • 1970-01-01
    • 2011-05-09
    • 2020-09-28
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    相关资源
    最近更新 更多