社区
通信技术
帖子详情
send()调用返回时是否已经全部发送完成?
Sodar
2000-09-08 08:34:00
我说得是在阻塞模式下。如果调用send()函数发送一个很大的数据包,能否在函数返回的时候保证已经全部发送完成了?
谢谢
...全文
179
5
打赏
收藏
send()调用返回时是否已经全部发送完成?
我说得是在阻塞模式下。如果调用send()函数发送一个很大的数据包,能否在函数返回的时候保证已经全部发送完成了? 谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Sodar
2000-09-11
打赏
举报
回复
谢谢各位,不过我还没有实验。先把分送上。
FengSC
2000-09-08
打赏
举报
回复
那要看你的"发完"是指什么意识如果是指本地已经送出,那是对的;如果是指对方接收到,那不一定正确。
nieyongxin
2000-09-08
打赏
举报
回复
FengSC说的是不对的,Gangster说的对了一半,
udp只管向外发送,对方有没有收到,它是不管的,它的优点是发送效率高。
TCP是可靠的,阻塞方式下必须等对方全部收到才会返回TRUE。
建议不要使用阻塞方式,如果对方没收到,则必须等TIMEOUT才能进行下一步操作,而之期间
则象假死机一样,建议使用消息或事件机制。
Gangster
2000-09-08
打赏
举报
回复
如果函数返回,有两种情况,一是有错,会马上返回,返回直是SOCKET_ERROR用WSAGetLastError()可得到具体错误。
二是正确返回,那数据就全发了,如果你用tcp那对方能受到,用udp则不一定
playpcgame
2000-09-08
打赏
举报
回复
FengSC说的是对的
调用
send
发送
网络数据包一定会立马
发送
出去吗?
Linux应用层
调用
了
send
发送
网络数据,那么按照简单的思维,这个动作会触发网卡
发送
数据,而现实并不是如此! socket层 首先对于
send
来说,分为阻塞
发送
和非阻塞
发送
: (1)阻塞操作 内核会检测
发送
缓冲区
是否
存在足够的空间存放用户数据,如果空间足够那么直接拷贝数据到socket
send
buffer,后续
发送
动作交给协议栈来支持;如果空间不够那么
send
操作会阻塞,直到内核
发送
缓冲区空间足够,再数据拷贝到
发送
缓冲区,并最后
返回
用户空间。 (2)非阻塞操作 对于非阻塞操作来说,当
发送
缓冲区空间不够
学习笔记:MPI的四种通信模式
学习笔记-MPI的四种通信模式 MPI共有四种通信模式。主要根据以下不同的情况来区分:
是否
需要对
发送
的数据进行缓存?
是否
只有当接收
调用
执行后才可以执行
发送
操作? 什么
时
候
发送
调用
可以正确
返回
?
发送
调用
正确
返回
是否
意味着
已经
发送
完成
?(
发送
缓冲区
是否
已经
可用?/数据
是否
已经
到达接收缓冲区?) 标准通信模式 MPI自身决定
是否
对
发送
数据进行缓存。 若缓存
发送
数据,则
发送
调用
的正确
返回
不依赖于...
socket的
send
系统
调用
Linux下面socket编程的非阻塞TCP研究 tcp协议本身是可靠的,并不等于应用程序用tcp
发送
数据就一定是可靠的. 不管
是否
阻塞,
send
发送
的大小,并不代表对端recv到多少的数据. 阻塞模式下,
send
函数的过程是将应用程序请求
发送
的数据拷贝到
发送
缓存中
发送
并得到确认后再
返回
.但由于
发送
缓存的存在,表现为:如果
发送
缓存大小比请求
发送
的大小要大,那么
send
函数立即
返回
Linux
send
系统
调用
net/socket.c
调用
send
,
调用
__sys_
send
to 应用层将待
发送
的数据放在自己申请的buff中 INETsocket层将数据放在msghdr{}中 INETsocket以下的层将数据放在sk_buff{}中 在
send
to的系统
调用
中,首先找到BSD socket,再
调用
send
_message。
send
message里面执行socket->ops->
send
msg。这里补充,执行的是sock的prot的
send
message,即真正的
send
message 比如
send
返回
值
在Unix系统下,如果
send
、recv、write在等待协议传送数据
时
,socket被shutdown,
调用
send
的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。此种情况应用就很难查出处理进程为什么退出。 SIGPIPE信号: 对 一个
已经
收到FIN包的socket
调用
read方法,如果接收缓冲已空,则
返回
0,这就是常说的表示连接关闭.但第一次对其
调用
write方法
时
,如果
发送
缓冲没问题,会
返回
正确写入(
发送
).但
发送
的报文会导...
通信技术
4,356
社区成员
28,926
社区内容
发帖
与我相关
我的任务
通信技术
通信技术相关讨论
复制链接
扫一扫
分享
社区描述
通信技术相关讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章