专门为难C高手,之如何从指定IP接受udp包

jamesontan 2008-10-30 09:11:00
unix下,我们知道可以从指定的IP和端口发送UDP包
请问那位高手有办法只从指定IP的指定port接受UDP包?呵呵
...全文
595 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
shihko 2009-06-03
  • 打赏
  • 举报
回复
这个问题我遇到过。
如果本机有多个IP,可以直接bind() UDP套接口到你想接收数据的IP和port。
这样当有UDP包发到别的地址的时候,自动丢弃。

不用connect。发送的时候才考虑connect以提高效率。
once_and_again 2008-11-10
  • 打赏
  • 举报
回复
结协包 的内容而已,
看upd的 报文格式.
jamesontan 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 Arthur_ 的回复:]

>对于不是指定的,不接受,而不是先读取,然后判断是否是指定IP,不是则丢弃的做法。
我觉得不太现实, 你为什么这么想呢?

>就像类似于TCP连接,固定套接字收发数据。
其实来一个报文tcp也要遍历一便所有的socket, 找到符合的socket(根据src ip/port dst ip/port)然后将报文放到一个缓冲队列中等你来recv。 换句话说就是先读在判断或丢弃或放到指定队列中。

>如何解决指从对端指定的IP和Port接受udp包
如…

[/Quote]
1、因为的的应用不能丢弃所有udp包,但是又需要分开处理不同的udp包,而且只能是同一个udp套接字接受,所以。。
2、这个是我题目的歧义,道歉,我的本意是如何解决从指定的对端IP而不是本地的指定IP接受UDP包,而且要求不能丢弃不是对端IP的UDP包
weidong0210 2008-11-10
  • 打赏
  • 举报
回复
up
jamesontan 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 lin_style 的回复:]
引用 32 楼 jamesontan 的回复:
引用 30 楼 bsky22 的回复:
楼主的说法不但有歧义,而且是错误的

首先,即使是TCP,也会丢弃不是本连接上的数据包,另外,数据报从远端传输过来,你只有接收和丢弃两种选择


我想你可能根本没写过tcp程序,你说的,首先,即使是TCP,也会丢弃不是本连接上的数据包,
想这种情况根本不会发生,不是本tcp连接上的字节流根本发不到本连接里来。
tcp是字节流,跟你说的数据包是有严格…
[/Quote]

呵呵,确实是为难大家了,这个问题,理论上是不能实现,但是实际上通过别的方法是可以解决的
至少我已经解决这个问题了,但是处理起来很复杂,需要非常规观念,呵呵
并向对该问题理解错误的同志道歉,是我的错,题目含义说的有歧义!
jamesontan 2008-11-09
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 kestre1 的回复:]
《Unix Network Programing》中貌似有类似的部分,我的理解是获得UDP包之后解析其IP地址,然后过滤。
UDP无连接,感觉获得包之前过滤不太可能。
[/Quote]

你说的确实有道理,但是我就是想找高手解决下这样的问题
问题不难,就不叫为难高手了,呵呵。
jamesontan 2008-11-09
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 bsky22 的回复:]
楼主的说法不但有歧义,而且是错误的

首先,即使是TCP,也会丢弃不是本连接上的数据包,另外,数据报从远端传输过来,你只有接收和丢弃两种选择
[/Quote]

我想你可能根本没写过tcp程序,你说的,首先,即使是TCP,也会丢弃不是本连接上的数据包,
想这种情况根本不会发生,不是本tcp连接上的字节流根本发不到本连接里来。
tcp是字节流,跟你说的数据包是有严格区别的。
jamesontan 2008-11-09
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 AisaC 的回复:]
引用 25 楼 jamesontan 的回复:
引用 24 楼 hqin6 的回复:
检查,不是我需要的就丢了!


我的要求是不能丢,就象TCP那样,点对点的收,只收指定地址的UDP,别的地址不收


前面说不接收,这会儿又是不能丢弃,西马奇怪了..

楼主是
buf x -->TempBox
buf xx -->TempBox

A线程--:x port--x.x.x.x;
B线程--:xx port--xx.xx.xx.xx;

A从TempBox取出buf x
B取出buf xx
这个意思?
[/Quote]
我的题目是有歧义,但是后面更正了,请看仔细,看明白,再发表高见!呵呵
Arthur_ 2008-11-09
  • 打赏
  • 举报
回复



>对于不是指定的,不接受,而不是先读取,然后判断是否是指定IP,不是则丢弃的做法。
我觉得不太现实, 你为什么这么想呢?

>就像类似于TCP连接,固定套接字收发数据。
其实来一个报文tcp也要遍历一便所有的socket, 找到符合的socket(根据src ip/port dst ip/port)然后将报文放到一个缓冲队列中等你来recv。 换句话说就是先读在判断或丢弃或放到指定队列中。

>如何解决指从对端指定的IP和Port接受udp包
如果ip只是本机 似乎你只要bind就可以(udp也可以bind)
如果你想指定任意的ip,你可以创建low-level socket,就是RAW SOCKET, 来抓取所有的数据。
然后类似tcp底层的实现过滤你需要的。
lin_style 2008-11-09
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 jamesontan 的回复:]
引用 30 楼 bsky22 的回复:
楼主的说法不但有歧义,而且是错误的

首先,即使是TCP,也会丢弃不是本连接上的数据包,另外,数据报从远端传输过来,你只有接收和丢弃两种选择


我想你可能根本没写过tcp程序,你说的,首先,即使是TCP,也会丢弃不是本连接上的数据包,
想这种情况根本不会发生,不是本tcp连接上的字节流根本发不到本连接里来。
tcp是字节流,跟你说的数据包是有严格区别的。
[/Quote]


又见楼主。。
汗,希望楼主以后发帖子,换个题目,专门为难网络高手比较好。。

描述下楼主问题,即只接收指定IP的包。但是这里就有个歧义了,什么只接收指定IP的包?换句话说就是,有没对其他非指定IP的包进行判断? 还是主进程将包放到不同的队列里,由相应的线程处理?

19楼对这个伪问题已经进行很好的描述。

至于connect可以这样描述
假设有client A1,server B,A1 connect to B,双方进行数据交互,这时让另一台机器启动A2,并向A1发送数据,会提示一个Connection refused错误。也就是说假设有一台服务器A,他只想让指定的用户连接,那么A则去connect对方。

楼主挑个楼层把问题专门整理下。。。实在没看明白
freesky_zhang 2008-11-09
  • 打赏
  • 举报
回复
steve 的tcp/ip书中好像谈到只接受远端指定ip和指定port的方法。。。。不过我忘记是在udp还是tcp里面讲的

----上帝会原谅我的无知,因为我是他造的。----
bsky22 2008-11-06
  • 打赏
  • 举报
回复
楼主的说法不但有歧义,而且是错误的

首先,即使是TCP,也会丢弃不是本连接上的数据包,另外,数据报从远端传输过来,你只有接收和丢弃两种选择
jamesontan 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 hqin6 的回复:]
检查,不是我需要的就丢了!
[/Quote]

我的要求是不能丢,就象TCP那样,点对点的收,只收指定地址的UDP,别的地址不收
「已注销」 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 jamesontan 的回复:]
引用 19 楼 fetag 的回复:
楼主,说实话,我觉得你这种需求应该是没法实现的。考虑下面的情况:

假设一台server暴露在网上,那它一定有IP地址,有某些开放的port。另外假设有两个clients,分别为A和

B,server只想接收来自A的消息,而不想接收B的消息。但问题是,如果B知道server的IP和port,并且B和

server之间的物理传输和路由都没问题,那B就可以给server发消息过来,这个行为是B自己的行为,无论

server是否…
[/Quote]
19楼说的对,这是以太网的设计必然造成的结果,以太网本身的策略就是广播,接收方负责过滤不要的包.
如果你一定要做,就要考虑令牌网的拓扑.
因为,你在接受一个包之前,没法知道这个包你究竟想不想要,不是吗?
kestre1 2008-11-05
  • 打赏
  • 举报
回复
《Unix Network Programing》中貌似有类似的部分,我的理解是获得UDP包之后解析其IP地址,然后过滤。
UDP无连接,感觉获得包之前过滤不太可能。
Arthur_ 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 jamesontan 的帖子:]
unix下,我们知道可以从指定的IP和端口发送UDP包
请问那位高手有办法只从指定IP的指定port接受UDP包?呵呵
[/Quote]

如果没有理解错的 你似乎可以在创建一个socket 并将其bind在某个端口上。
神马都能聊 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 jamesontan 的回复:]
引用 24 楼 hqin6 的回复:
检查,不是我需要的就丢了!


我的要求是不能丢,就象TCP那样,点对点的收,只收指定地址的UDP,别的地址不收
[/Quote]

前面说不接收,这会儿又是不能丢弃,西马奇怪了..

楼主是
buf x -->TempBox
buf xx -->TempBox

A线程--:x port--x.x.x.x;
B线程--:xx port--xx.xx.xx.xx;

A从TempBox取出buf x
B取出buf xx
这个意思?

jamesontan 2008-11-04
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 luansxx 的回复:]
udp没有客户端,服务器的区别,两边都可以connect,当然两边要知道ip,并约定好port
[/Quote]

请高手提供一下具体代码?
太乙 2008-11-04
  • 打赏
  • 举报
回复
检查,不是我需要的就丢了!
jamesontan 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 fetag 的回复:]
楼主,说实话,我觉得你这种需求应该是没法实现的。考虑下面的情况:

假设一台server暴露在网上,那它一定有IP地址,有某些开放的port。另外假设有两个clients,分别为A和

B,server只想接收来自A的消息,而不想接收B的消息。但问题是,如果B知道server的IP和port,并且B和

server之间的物理传输和路由都没问题,那B就可以给server发消息过来,这个行为是B自己的行为,无论

server是否“同意”,它都会收到B发来…
[/Quote]

呵呵,你说的很有道理,不过任何难题或者科研题目,在解决之前,一般都觉得是不可能的,但是事实证明
后来大都解决了。我这么做的主要目的是想收到的udp包都不能丢弃,因为这些udp包可能都是有用的,只是需要不同的线程来处理。
或许有别的办法,有没有这种可能, server首先不管是谁发过来的UDP包,首先都把他收进一个buf,然后
线程根据指定IP到该buf读取,读出一段,就删除之,有没有这种可能的实现方法?
加载更多回复(21)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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