socket udp 通信的问题?请大侠帮忙,非常感谢!!!

zhu6789888 2010-01-09 03:42:06
1、程序需要1秒发送40次 数据A 到 目的主机(192.168.1.102)
2、要接收 目的主机(点播) 发送过来的数据

3、接收 和 发送 的端口是相同 7788(这个端口随便)

4、我创建了两个socket 一个用来专门发送数据。一个用来专门 接收数据

5、接收我开了线程来接收的,发送用的定时器来发送。

可是 会出现这样的问题, 目的主机发送过来的数据,有的时候接收的道,有的时候又接收不到,

请问 是什么原因呢 ?非常感谢!


6、最后,我用一个socket ,既负责接收,有负责发送,这样就可以每次都可以接收到 目的主机发送过来的数据。

搞不懂用两个socket 单独来负责,为什么还会出现接收不到的情况呢 ? 这个跟用同一个端口有关吗 ?

请大侠们帮下忙,O(∩_∩)O谢谢!
...全文
325 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
fabiodeng 2011-07-01
  • 打赏
  • 举报
回复
请问找到原因了吗?
zhu6789888 2010-01-23
  • 打赏
  • 举报
回复
up
zhu6789888 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 wenxy1 的回复:]
引用 24 楼 zhu6789888 的回复:
引用 23 楼 wenxy1 的回复:
1、程序需要1秒发送40次 数据A 到 目的主机(192.168.1.102)
2、要接收 目的主机(点播) 发送过来的数据
Question: 什么是点播?我只听说过单播,多播,任播。

3、接收 和 发送 的端口是相同 7788(这个端口随便)
4、我创建了两个socket 一个用来专门发送数据。一个用来专门 接收数据
Answer: socket是双工的,创建一个socket就行了。

5、接收我开了线程来接收的,发送用的定时器来发送。
可是 会出现这样的问题, 目的主机发送过来的数据,有的时候接收的道,有的时候又接收不到,
请问 是什么原因呢 ?非常感谢!
Answer: UDP是不可靠的无连接的数据报协议,UDP存在丢包的可能性。


6、最后,我用一个socket ,既负责接收,有负责发送,这样就可以每次都可以接收到 目的主机发送过来的数据。
搞不懂用两个socket 单独来负责,为什么还会出现接收不到的情况呢 ? 这个跟用同一个端口有关吗 ?
请大侠们帮下忙,O(∩_∩)O谢谢!
Answer: 用两个socket,你是自找麻烦。


恩,我就是想知道什么原因呢?谢谢了~~·


原因,我不是说了吗!!!
[/Quote]

谢谢大哥,可是我想知道第六点的原因,您只回答了,自找麻烦。
(我说的点播可能就是大哥说的单播吧)
Wenxy1 2010-01-18
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 zhu6789888 的回复:]
引用 23 楼 wenxy1 的回复:
1、程序需要1秒发送40次 数据A 到 目的主机(192.168.1.102)
2、要接收 目的主机(点播) 发送过来的数据
Question: 什么是点播?我只听说过单播,多播,任播。

3、接收 和 发送 的端口是相同 7788(这个端口随便)
4、我创建了两个socket 一个用来专门发送数据。一个用来专门 接收数据
Answer: socket是双工的,创建一个socket就行了。

5、接收我开了线程来接收的,发送用的定时器来发送。
可是 会出现这样的问题, 目的主机发送过来的数据,有的时候接收的道,有的时候又接收不到,
请问 是什么原因呢 ?非常感谢!
Answer: UDP是不可靠的无连接的数据报协议,UDP存在丢包的可能性。


6、最后,我用一个socket ,既负责接收,有负责发送,这样就可以每次都可以接收到 目的主机发送过来的数据。
搞不懂用两个socket 单独来负责,为什么还会出现接收不到的情况呢 ? 这个跟用同一个端口有关吗 ?
请大侠们帮下忙,O(∩_∩)O谢谢!
Answer: 用两个socket,你是自找麻烦。




恩,我就是想知道什么原因呢?谢谢了~~·
[/Quote]

原因,我不是说了吗!!!
zhu6789888 2010-01-18
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 conry 的回复:]
windows下是根据port来判断数据是属于那个进程的,这个一般没什么疑问,但是对同一进程两个socket绑定同样的ip,端口的数据分配不太确定,
今天用代码测试了一下(仅测试了UDP,TCP等有时间再测)(xpsp2 vc2003)

如果同一进程两个socket绑定同样的ip,端口,那个先接收的数据socket就会一直收到数据,也就是系统会把后续的数据给先接收到数据的socket
[/Quote]

哦,谢谢了~
Conry 2010-01-17
  • 打赏
  • 举报
回复
windows下是根据port来判断数据是属于那个进程的,这个一般没什么疑问,但是对同一进程两个socket绑定同样的ip,端口的数据分配不太确定,
今天用代码测试了一下(仅测试了UDP,TCP等有时间再测)(xpsp2 vc2003)

如果同一进程两个socket绑定同样的ip,端口,那个先接收的数据socket就会一直收到数据,也就是系统会把后续的数据给先接收到数据的socket
zhu6789888 2010-01-17
  • 打赏
  • 举报
回复
顶~~~~~~~~~~~~~~
Wenxy1 2010-01-14
  • 打赏
  • 举报
回复
1、程序需要1秒发送40次 数据A 到 目的主机(192.168.1.102)
2、要接收 目的主机(点播) 发送过来的数据
Question: 什么是点播?我只听说过单播,多播,任播。

3、接收 和 发送 的端口是相同 7788(这个端口随便)
4、我创建了两个socket 一个用来专门发送数据。一个用来专门 接收数据
Answer: socket是双工的,创建一个socket就行了。

5、接收我开了线程来接收的,发送用的定时器来发送。
可是 会出现这样的问题, 目的主机发送过来的数据,有的时候接收的道,有的时候又接收不到,
请问 是什么原因呢 ?非常感谢!
Answer: UDP是不可靠的无连接的数据报协议,UDP存在丢包的可能性。


6、最后,我用一个socket ,既负责接收,有负责发送,这样就可以每次都可以接收到 目的主机发送过来的数据。
搞不懂用两个socket 单独来负责,为什么还会出现接收不到的情况呢 ? 这个跟用同一个端口有关吗 ?
请大侠们帮下忙,O(∩_∩)O谢谢!
Answer: 用两个socket,你是自找麻烦。

zhu6789888 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 wnx_u 的回复:]
我以前做过端口复用,思路是这样的
1、设置端口可复用;
2、创建一个sockA,并将sockA和USERPORT绑定,然后用sockA来接收数据;
3、创建一个sockB,不将sockB和任何端口绑定,然后用sockB来发数据,然后发数据的时候记得用USERPORT就行了。
但这样可能系统会默认将sockB和某个端口绑定起来,可能还是用了两个端口,但当时我只管达到用一个端口两个SOCKET,一发一收就行了,嘿嘿
[/Quote]

这个方法不错,呵呵~~~
zhu6789888 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 wenxy1 的回复:]
1、程序需要1秒发送40次 数据A 到 目的主机(192.168.1.102)
2、要接收 目的主机(点播) 发送过来的数据
Question: 什么是点播?我只听说过单播,多播,任播。

3、接收 和 发送 的端口是相同 7788(这个端口随便)
4、我创建了两个socket 一个用来专门发送数据。一个用来专门 接收数据
Answer: socket是双工的,创建一个socket就行了。

5、接收我开了线程来接收的,发送用的定时器来发送。
可是 会出现这样的问题, 目的主机发送过来的数据,有的时候接收的道,有的时候又接收不到,
请问 是什么原因呢 ?非常感谢!
Answer: UDP是不可靠的无连接的数据报协议,UDP存在丢包的可能性。


6、最后,我用一个socket ,既负责接收,有负责发送,这样就可以每次都可以接收到 目的主机发送过来的数据。
搞不懂用两个socket 单独来负责,为什么还会出现接收不到的情况呢 ? 这个跟用同一个端口有关吗 ?
请大侠们帮下忙,O(∩_∩)O谢谢!
Answer: 用两个socket,你是自找麻烦。


[/Quote]

恩,我就是想知道什么原因呢?谢谢了~~·
wnx_u 2010-01-13
  • 打赏
  • 举报
回复
我以前做过端口复用,思路是这样的
1、设置端口可复用;
2、创建一个sockA,并将sockA和USERPORT绑定,然后用sockA来接收数据;
3、创建一个sockB,不将sockB和任何端口绑定,然后用sockB来发数据,然后发数据的时候记得用USERPORT就行了。
但这样可能系统会默认将sockB和某个端口绑定起来,可能还是用了两个端口,但当时我只管达到用一个端口两个SOCKET,一发一收就行了,嘿嘿
jzhouts 2010-01-13
  • 打赏
  • 举报
回复
如果你程序没问题,那就有可能是因为你用的是udp协议 ,所以有时候会丢包。
UDX协议 2010-01-13
  • 打赏
  • 举报
回复
先找一个工具,或别人的程序,看在同样条件下工作。如果别人的可以就已经说明问题了。
av007007 2010-01-12
  • 打赏
  • 举报
回复
up
qingfeng_happy5 2010-01-12
  • 打赏
  • 举报
回复
每个套接字都应该对应唯一的(IP,PORT),即使IP相同,port也应该不同,要不然协议栈在接收到数据后,就不知道该发给哪个应该程序处理了。但两个TCP和UDP套接字可以有相同的(IP,PORT)。你可以把port号看成是正在通讯的进程的标识。
zhu6789888 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hwsts2 的回复:]
真没用2个端口试过,
不过你有现成的代码可以这样试一试,

一个端口邦定 2个SOCKET  A, B:  A用来发送数据的那个SOCKET,B为你用来接收的SOCKET]
你开两Thread,TA, TB
在TA当中 使用A来发送数据,但是同时,你也加入使用A来接收数据的代码
在TB当中 使用B来接收数据

然后你LOG以下看看是不是有时,在A也能接受到数据?
[/Quote]

恩,可以试试你的方法,看是不是有问题,谢谢先。
zhu6789888 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 qingfeng_happy5 的回复:]
每个套接字都应该对应唯一的(IP,PORT),即使IP相同,port也应该不同,要不然协议栈在接收到数据后,就不知道该发给哪个应该程序处理了。但两个TCP和UDP套接字可以有相同的(IP,PORT)。你可以把port号看成是正在通讯的进程的标识。
[/Quote]

那就是说同样的IP port 只能绑定一个socket吗?
我用了复用的,两个socket 的都绑定成功了,
现在就是数据有时候会接收不到。
zhu6789888 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wwwllg 的回复:]
引用 11 楼 zhu6789888 的回复:
引用 10 楼 wwwllg 的回复:
udp,可以从内网往外网发,但是外网是不能主动发往内网的,这叫不请自来包,会直接被丢掉。

除非你p2p成功。

所以,你最好不要用二个socket.


没有外网和内网之分,
我的通讯就是局域网内的。


如果你没有跨网段的话,完全可以肯定你的代码有问题。
[/Quote]

不知道有您有没有仔细看我的问题,
如果跨网段的话,为什么有时候又可以收到数据呢 ?谢谢!
UDX协议 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhu6789888 的回复:]
引用 10 楼 wwwllg 的回复:
udp,可以从内网往外网发,但是外网是不能主动发往内网的,这叫不请自来包,会直接被丢掉。

除非你p2p成功。

所以,你最好不要用二个socket.


没有外网和内网之分,
我的通讯就是局域网内的。
[/Quote]

如果你没有跨网段的话,完全可以肯定你的代码有问题。
hwsts2 2010-01-11
  • 打赏
  • 举报
回复
真没用2个端口试过,
不过你有现成的代码可以这样试一试,

一个端口邦定 2个SOCKET A, B: A用来发送数据的那个SOCKET,B为你用来接收的SOCKET]
你开两Thread,TA, TB
在TA当中 使用A来发送数据,但是同时,你也加入使用A来接收数据的代码
在TB当中 使用B来接收数据

然后你LOG以下看看是不是有时,在A也能接受到数据?
加载更多回复(12)

18,356

社区成员

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

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