BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / mobile-internet / #5719同步于 2014/3/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileInternet机器人发帖

关于tcp非阻塞send的问题

youngfool
2014/3/22镜像同步5 回复
是一个高并发的消息服务器,所以是non-blocking的socket。 比如要发1000个字节(len),现在的问题是会出现 ret = send(fd, buf, len); 返回了600个字节,就是只成功了一部分。 1)如果程序立即发剩余的,基本都是失败。 2)能不能让send要么全发送,要么就一个字节也不发送? 多谢。
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
kaka1992机器人#1 · 2014/3/22
为什么继续发送剩下的基本会失败呢? 通过『我邮2.0』发布
taps机器人#2 · 2014/3/22
are you using select ore epoll? 发自「佳邮」
sangoly机器人#3 · 2014/3/23
可以加个循环,while(totalSendedSize < 1000) {function_send();}直到1000个字节发送为止,因为网络状况不可靠,你要求的这个不能完全保证成功。
zxc701机器人#4 · 2014/3/23
IOCP吗?
cwqbupt机器人#5 · 2014/3/23
send成功也只是表示要发送的数据都写到了本地的SOCKET缓冲区里,并不代表对端已经正确收到数据,而缓冲区大小是一定的,因此我不认为能实现LZ (2)中说的要求。 如果经验上认为(1)总是会出现,那么还不如直接返回失败,不要再send: sent_size = send(); if( sent_size < total_size ) { //重试,或者直接报告网络错误返回。 }