今天继续完成视频转发工具,使用udp监听本地的8003端口,接收用户发送的视频转发请求。
程序完成了,自己写个小工具模拟数据请求,来测试程序是否正常工作。
这时候,出问题了。
测试步骤:
(1)在虚拟机(Fecdora Core12)里运行程序
(2)在主机里使用工具发送模拟请求
(3)查看程序是否正常工作
但是,结果是:虚拟机Fecord Core12里监听的socket一直无法接收到主机发送的udp数据包,使用lsof -i查看,程序确实打开了监听端口:
[root@chu xsock]# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 791 rpc 6u IPv4 5997 0t0 UDP *:sunrpc
rpcbind 791 rpc 7u IPv4 6001 0t0 UDP *:966
rpcbind 791 rpc 8u IPv4 6002 0t0 TCP *:sunrpc (LISTEN)
rpcbind 791 rpc 9u IPv6 6004 0t0 UDP *:sunrpc
rpcbind 791 rpc 10u IPv6 6006 0t0 UDP *:966
rpcbind 791 rpc 11u IPv6 6007 0t0 TCP *:sunrpc (LISTEN)
cupsd 823 root 6u IPv6 6146 0t0 TCP localhost:ipp (LISTEN)
cupsd 823 root 7u IPv4 6147 0t0 TCP localhost:ipp (LISTEN)
cupsd 823 root 9u IPv4 6150 0t0 UDP *:ipp
rpc.statd 1013 rpcuser 5u IPv4 6940 0t0 UDP *:webster
rpc.statd 1013 rpcuser 7u IPv4 6949 0t0 UDP *:33396
rpc.statd 1013 rpcuser 8u IPv4 6953 0t0 TCP *:40877 (LISTEN)
sshd 1181 root 3u IPv4 7542 0t0 TCP *:ssh (LISTEN)
sshd 1181 root 4u IPv6 7544 0t0 TCP *:ssh (LISTEN)
sendmail 1196 root 4u IPv4 7592 0t0 TCP localhost:smtp (LISTEN)
dhclient 10321 root 6u IPv4 34639 0t0 UDP *:bootpc
videotran 10615 root 4u IPv4 37324 0t0 UDP *:mcreport ------------------------->监听的端口
使用tcpdump port 8003,也确实收到了主机发送的udp数据包:
[root@chu testVideoCMD]# tcpdump port 8003
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
18:04:42.155902 IP 192.168.110.69.7293 > 192.168.110.100.mcreport: UDP, length 112
但是,socket的recvfrom就是收不到数据。
而且,在虚拟机里用同样的工具发送却能收到。
问题会在哪呢?
由于socket这块是从别的项目移植过来的代码,我担心代码可能存在bug,因此检查了一遍又一遍,确认没有问题;又请头儿看了一遍,确认也没问题。我甚至都怀疑测试工具是不是有问题;还把虚拟机的网络连接从NAT到桥接到其他所有方式,都试了个遍。
最后,头儿建议把防火墙关掉。
虽然之前也考虑到了防火墙,但想:既然tcpdump都收到数据了,应该不会被防火墙过滤掉阿?头儿说,tcpmdump做的很底层,可能防火墙过滤不掉,但把我们的程序给过滤掉了。
于是,我就尝试着把防火墙关掉了:
service iptables stop
结果证明:就是防火墙捣的鬼。关掉防火墙后一切正常了。
关于防火墙的一些知识:
关闭Fedora的防火墙
重启后生效
开启: chkconfig iptables on
关闭: chkconfig iptables off 或者 /sbin/chkconfig --level 2345 iptables off
2) 即时生效,重启后失效
service 方式
开启: service iptables start
关闭: service iptables stop
iptables方式
查看防火墙状态:
/etc/init.d/iptables status
暂时关闭防火墙:
/etc/init.d/iptables stop
重启iptables:
/etc/init.d/iptables restart
http://www.cnblogs.com/eoiioe/archive/2008/12/28/1363913.html
问题:iptable为什么其他机器发送到8003端口的udp数据包给过滤掉呢?
看来有时间得了解一下iptable的机制了。
刚才查了一下:我使用的8003端口是小于1024,已被一下服务使用的端口:
mcreport 8003/tcp Mulberry Connect Reporting Service
mcreport 8003/udp Mulberry Connect Reporting Service
要配置防火墙也可以通过:system-config-firewall命令来搞定。
最后,结论是:万恶的防火墙阿,在开发时只会碍事,能关就关掉吧。
ps:悼念俺这悲催的一天。。。