udp下sendto的问题

cy214 2008-07-10 04:58:57
假如 发送缓冲区 小于 要发送数据 的大小
那么sendto会返回部分发送成功的长度
还是发送失败?

如果返回部分发送成功的数据长度 是否违反数据报协议的消息边界?
不解 请明人帮我解释一下
...全文
496 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
WinEggDrop 2008-07-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 cy214 的帖子:]
假如 发送缓冲区 小于 要发送数据 的大小
那么sendto会返回部分发送成功的长度
还是发送失败?

如果返回部分发送成功的数据长度 是否违反数据报协议的消息边界?
不解 请明人帮我解释一下
[/Quote]

UDP数据是很特别的,因为它是由两部分组成的,一个UDP头+内容.UDP一个包最大长度过能超过64K,但一个64K的UDP包除非在内网中进行传输,不然在英特网中一上64K的UDP包能成功传送是基本可能性不大的.由于UDP包带有UDP头,报文头中带有目标地址,端口等信息的.如果不能一次性发完,例如只是发了一半,那么另一半就没了报文头了.这就是为什么UDP单个包要不就是全部发送成功,要不就是丢包,不会出现一个包被发成两部分发出去的.以下是msdn的原话:
"The sendto function is used to write outgoing data on a socket. For message-oriented sockets, care must be taken not to exceed the maximum packet size of the underlying subnets, which can be obtained by using getsockopt to retrieve the value of socket option SO_MAX_MSG_SIZE. If the data is too long to pass atomically through the underlying protocol, the error WSAEMSGSIZE is returned and no data is transmitted."

关键是"If the data is too long to pass atomically through the underlying protocol, the error WSAEMSGSIZE is returned and no data is transmitted".

主要是说如果数据太长不能完全发送通过,就会返回WSAEMSGSIZE的错误,而且没有数据被传送.


veldwolf 2008-07-10
  • 打赏
  • 举报
回复
这里有2个问题需要说一下,首先sendto可以用在面向消息的socket和面向tcp流的socket,在面向tcp流的socket时,sendto的行为跟send的行为是一样的,所以sendto可以返回小于发送长度的数据,当然这是在non-blocking模式下。第二个问题,用在面向消息的socket时,在non-blocking模式下,如果数据发送不出将会失败,在block模式下,将会阻塞,面向消息的模式下,sendto是一定要把数据发送完的,当然数据的最大长度不能超过网络的最大包大小,否则会返回WSAEMSGSIZE错误。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧