两个线程同时使用一个socket进行send,会出现什么问题?

txz_yshb 2010-09-14 09:23:02
请教关于socket编程的send函数!(TCP)

今天遇到一个问题,先send一个大文件,估计时间比较长,另一个线程在这中间想发送另外一段数据,请问直接用这个socket进行send会出现什么问题,是否会成功?
...全文
1564 17 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
试试才知道 。。。
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
  • 打赏
  • 举报
回复
发送会成功,接收会错误

18,356

社区成员

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

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