社区
网络编程
帖子详情
两个线程同时使用一个socket进行send,会出现什么问题?
txz_yshb
2010-09-14 09:23:02
请教关于socket编程的send函数!(TCP)
今天遇到一个问题,先send一个大文件,估计时间比较长,另一个线程在这中间想发送另外一段数据,请问直接用这个socket进行send会出现什么问题,是否会成功?
...全文
1564
17
打赏
收藏
两个线程同时使用一个socket进行send,会出现什么问题?
请教关于socket编程的send函数!(TCP) 今天遇到一个问题,先send一个大文件,估计时间比较长,另一个线程在这中间想发送另外一段数据,请问直接用这个socket进行send会出现什么问题,是否会成功?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
17 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ggw007
2010-09-16
打赏
举报
回复
[Quote=引用 8 楼 ggw007 的回复:]
引用 7 楼 txz_yshb 的回复:
引用 4 楼 kafly 的回复:
非阻塞情况下同时发包时,如果被底层分包,且没有一个有效的头来判定分包属于哪次send的数据,接收时会混淆.
这个在接收端我当然会进行判断了,就是不知道收到的数据会不会出现混乱,就是在接受缓冲区有没可能是大文件和再次发送的数据交叉出现,导致我无法进行判断。感觉系统可以分辨的吧
我以前好像试过,W……
[/Quote]
以前是用阻塞方式做的,今天我又用非阻塞方式测试了一下,WINDOW保证了每次SEND的数据块的完整性,SEND和SEND之间是不会有数据交叉情况出现的
txz_yshb
2010-09-16
打赏
举报
回复
感觉还是要避免同时send的好,谢谢各位了,结贴
yuchongjike
2010-09-15
打赏
举报
回复
根据线程的执行原理:
A运行一段时间后换B运行
B运行一段时间后再换A运行
这样循环下去就是一个多线程.
两个线程同时操作一个大的缓冲区,有可能会造成不安全访问,产生冲突,这样数据应该会乱掉吧???试过才知道.
随遇而安的牛人
2010-09-15
打赏
举报
回复
是要试一下吧
似水流年__
2010-09-15
打赏
举报
回复
试试才知道 。。。
Eleven
2010-09-15
打赏
举报
回复
你接收端的话可能需要做一下处理,因为你的发送端2个线程分别发送了数据包A和B,你接收端的话接收到A和B以后,需要处理一下A和B的顺序
dingyong2003
2010-09-15
打赏
举报
回复
如果你在发文件时是拆成小包出去, 到了服务器自己解析包的话, 是可以的! 因为到了服务器你自己再组合分枝就行了!
ggw007
2010-09-15
打赏
举报
回复
[Quote=引用 7 楼 txz_yshb 的回复:]
引用 4 楼 kafly 的回复:
非阻塞情况下同时发包时,如果被底层分包,且没有一个有效的头来判定分包属于哪次send的数据,接收时会混淆.
这个在接收端我当然会进行判断了,就是不知道收到的数据会不会出现混乱,就是在接受缓冲区有没可能是大文件和再次发送的数据交叉出现,导致我无法进行判断。感觉系统可以分辨的吧
[/Quote]
我以前好像试过,Windows好像保证了每次发送数据过程的完整性,Send和Send之间不会重叠,但是没看到相关说明,
txz_yshb
2010-09-15
打赏
举报
回复
[Quote=引用 4 楼 kafly 的回复:]
非阻塞情况下同时发包时,如果被底层分包,且没有一个有效的头来判定分包属于哪次send的数据,接收时会混淆.
[/Quote]
这个在接收端我当然会进行判断了,就是不知道收到的数据会不会出现混乱,就是在接受缓冲区有没可能是大文件和再次发送的数据交叉出现,导致我无法进行判断。感觉系统可以分辨的吧
fo1_sky
2010-09-15
打赏
举报
回复
可能会数据混乱
lijianli9
2010-09-15
打赏
举报
回复
只要有相应的封包,而且接收端不依赖于发送的数据顺序。
txz_yshb
2010-09-15
打赏
举报
回复
[Quote=引用 13 楼 yuchongjike 的回复:]
根据线程的执行原理:
A运行一段时间后换B运行
B运行一段时间后再换A运行
这样循环下去就是一个多线程.
两个线程同时操作一个大的缓冲区,有可能会造成不安全访问,产生冲突,这样数据应该会乱掉吧???试过才知道.
[/Quote]
有道理,那我这样做应该可以:
创建一个临界区,A中大文件自己分片循环发送,每个分片打上自己的应用头,进入临界区后再send,B中同样处理。
多线程啊,好麻烦
Conry
2010-09-14
打赏
举报
回复
[Quote=引用 2 楼 txz_yshb 的回复:]
引用 1 楼 jiuchang 的回复:
发送会成功,接收会错误
既然可以发送成功,接收方又会出现什么错误呢?
[/Quote]
一个socket就一个系统缓冲区,同时写,数据当然会错误了
kafly
2010-09-14
打赏
举报
回复
非阻塞情况下同时发包时,如果被底层分包,且没有一个有效的头来判定分包属于哪次send的数据,接收时会混淆.
Csuxiaowu
2010-09-14
打赏
举报
回复
楼主最好自己试一下
2楼说的有道理
你都在发 另一个线程发送的也会被接收 会被接收端当成大文件的一部分的
txz_yshb
2010-09-14
打赏
举报
回复
[Quote=引用 1 楼 jiuchang 的回复:]
发送会成功,接收会错误
[/Quote]
既然可以发送成功,接收方又会出现什么错误呢?
jiuchang
2010-09-14
打赏
举报
回复
发送会成功,接收会错误
客户端app多个
线程
对
一个
socket
发送数据
客户端一般是
一个
发送
线程
,
一个
socket
多个发送
线程
竞争
一个
socket
没什么意义,不
会
提高发送速度,因为
socket
只有
一个
,只要
socket
在发送
一个
线程
的数据时,该
socket
就被占用了,是不
会
响应其他
线程
的发送数据请求的。除非客户端维护有多个
socket
。 服务端
使用
多
线程
向多个客户端同时发送数据是因为服务端维护着多个
socket
,每个
socket
对应
一个
客户端session连接。 参考: 客户端:多
线程
使用
单个
SOCKET
发数 请教:多
线程
使用
同
一个
socket
进行
数据收发
会
出现
什么
问题
?
多
线程
中对同一
socket
调用
send
/
send
to
群里问多
线程
环境中对
一个
socket
进行
send
可以不可以; 答: 这个
问题
不是多
线程
问题
, 是TCP / UDP 的
问题
; 如果是tcp ,这是个错误的设计,如果你无视数据顺序,那可以 ;如果是udp可以; TCP: 在win32上,我没有找到
send
是否
线程
安全, 但找到了WSA
Send
并不是
线程
安全的.因此假设
send
也不是
线程
安全的,仅仅假设; 在posi...
多
线程
问题
:为什么不应该
使用
多
线程
读写同
一个
socket
连接?
为什么不应该
使用
多
线程
读写
一个
socket
连接
Send
的基本规则 & 能否多个进程或
线程
同时向同
一个
Socket
传递数据
一、
Socket
中
send
的普通执行流程。 当调用该函数时,
send
先比较待发送数据的长度len和套接字s的发送缓冲的长度, (1) 如果len大于s的发送缓冲区的长度,该函数返回
SOCKET
_ERROR; (2) 如果len小于或者等于s的发送缓冲区的长度,那么
send
先检查协议是否正在发送s的发送缓冲中的数据,就是等待协议把数据发送完 (3) 如
linux 网络编程:
使用
两
线程
实现
socket
同时收发数据
工作中最近有
使用
到
socket
向客户端同时发送和接收数据,因为是嵌入式linux设备,且要求只能同时
一个
客户端连接该端口。考虑到节省系统资源,只创建了
两个
线程
分别实现服务端的收发数据。下面直接上代码,该代码为在PC机上程序,已作详细注释。 server.c #include #include #include #include #include #include #include #incl...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章