2013-02-05 27 views
0

在Linux或Windows socket编程Socket编程的send()的返回值

我知道读返回一个值,表示 成功接收的字节数数。

该返回值可能会小于请求的长度。 (即,读(SD,BUF,100)可能返回50,如果接收缓冲器 仅具有50个字节)

是有可能,

send(sd, buf, 100); 

返回1〜99之间的值Δα 如果是,现在是什么情况? 我想知道具体的例子情况。

预先感谢您

回答

2

man页面,或者如果你正在谈论的Winsock,为官方指定的MSDN文档。

实践,send()阻塞模式发送的所有数据,无论文件说什么,除非有一个错误,在这种情况下没有被发送。

在非阻塞模式下,它将发送任何适合套接字发送缓冲区的数据,并在大于0时返回该长度。如果套接字发送缓冲区已满,则返回-1,其中errno = EWOULDBLOCK/EAGAIN

+0

谢谢你,这正是我所设想的。你确认了,谢谢 – daehee

+0

我还没有测试过,但我想如果你通过阻塞I/O发送非常大的缓冲区(例如每个send()调用超过65KB),那么发送( )发送部分数据,然后遇到错误(例如远程对等关闭连接)。在这种情况下,我认为send()行为唯一有用的方法是返回发送的字节数,这将小于缓冲区大小。这在实践中并不经常发生,因为大多数程序不会在一次调用中发送太多数据。 –

+1

@JeremyFriesner根据规格是可能的。实际上,它不会发生,也不是因为“大多数程序不会尝试发送太多数据”,而是因为这是'send()'在所有内核中实现的方式。 – EJP