关于udp,双网卡的问题

376 views
Skip to first unread message

ben

unread,
Nov 4, 2009, 11:29:49 PM11/4/09
to 高性能服务器研发与运营邮件列表
关于这个问题在网上找了一下,有好多朋友碰到了,但是没有解决办法,只能发到这里,请高人指点了。
场景:服务器上有两块网卡,一个内网a, 一个外网b,在客户端启动一个服务器,绑定在a网卡上:
memset(&servaddr,0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(ip);//htonl(INADDR_ANY);
servaddr.sin_port = htons(port);

/* bind address and port to socket */
if(bind(fd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
{
perror("bind error");
return false;
}

能从绑定的端口收到数据,然会回射给客户端:
r = sendto(server_fd, dptr, len, 0, (struct sockaddr *)&(saddr), sizeof
(struct sockaddr));
返回值是是成功的,r=len,但是对方却收不到,禁用外网卡b后就可以了!用tcpdump看一下,发现只有客户端到服务器的,服务器发送出去的的没
有。实在不知道原因,我已经绑定ip了,udp应该能发送出去啊,再说就算发送到外网卡了,用tcpdump也应该能看到啊,请高人指点!

周龙亭

unread,
Nov 5, 2009, 12:13:22 AM11/5/09
to dev4s...@googlegroups.com
用于sendto的FD也bind到一个IP,port试试。

ben

unread,
Nov 5, 2009, 4:46:48 AM11/5/09
to 高性能服务器研发与运营邮件列表
sendto的server_fd,就是绑定的fd

On 11月5日, 下午1时13分, 周龙亭 <njdragon...@gmail.com> wrote:
> 用于sendto的FD也bind到一个IP,port试试。
>
> 2009/11/5 ben <lizp....@gmail.com>

> > 有。实在不知道原因,我已经绑定ip了,udp应该能发送出去啊,再说就算发送到外网卡了,用tcpdump也应该能看到啊,请高人指点!- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Tomt

unread,
Nov 5, 2009, 6:31:57 AM11/5/09
to dev4s...@googlegroups.com
是不是路由的问题?

Mockey

unread,
Nov 5, 2009, 7:05:15 AM11/5/09
to 高性能服务器研发与运营邮件列表

在服务器上抓所有网卡上的数据包,包括ICMP的,看看发送的数据是怎么流向的。

路由表什么样子的 ?


On 11月5日, 下午7时31分, Tomt <tomtfore...@gmail.com> wrote:
> 是不是路由的问题?

xiang neou

unread,
Nov 5, 2009, 10:11:02 AM11/5/09
to dev4s...@googlegroups.com
肯定是路由的问题。
2009/11/5 Mockey <mocke...@gmail.com>

ben

unread,
Nov 6, 2009, 4:36:37 AM11/6/09
to 高性能服务器研发与运营邮件列表
大家能说一下原因吗?因为在客户现场,现在是把其中一块网卡删除了,暂时可以运行,还没机会去尝试找原因,如果是路由原因,用tcpdump怎么看
icmp的包来判断,还请高人指点。。

On 11月5日, 下午11时11分, xiang neou <gensheng...@gmail.com> wrote:
> 肯定是路由的问题。
> 2009/11/5 Mockey <mockey.c...@gmail.com>


>
>
>
>
>
> > 在服务器上抓所有网卡上的数据包,包括ICMP的,看看发送的数据是怎么流向的。
>
> > 路由表什么样子的 ?
>
> > On 11月5日, 下午7时31分, Tomt <tomtfore...@gmail.com> wrote:

> > > 是不是路由的问题?- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Mockey

unread,
Nov 6, 2009, 5:59:49 AM11/6/09
to 高性能服务器研发与运营邮件列表
1. 检查你的路由表

2. 使用traceroute看看到你要发送的目的地址的路由信息:
traceroute targetip

如果路由不可达,ICMP会返回该类型的错误的。

ben

unread,
Nov 10, 2009, 1:55:44 AM11/10/09
to 高性能服务器研发与运营邮件列表
问题找到了,就是路由表的问题!
原来路由表:
[root@localhost data]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref
Use Iface
114.251.79.0 0.0.0.0 255.255.255.248 U 0 0
0 eth1
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0
0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0
0 eth1
0.0.0.0 114.251.79.1 0.0.0.0 UG 0 0
0 eth1

应该是默认是走114.251.79.1网关,而绑定的是192.168.1.18ip上造成的。
增加:
route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.1.1 dev eth0
其中udp发送是绑定在192.168.1.18上的,发送目的网段是10网段,设置该路由后就好了!
再次向朋友们表示感谢!

> > > - 显示引用的文字 -- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Reply all
Reply to author
Forward
0 new messages