- 论坛徽章:
- 1
|
本帖最后由 群雄逐鹿中原 于 2014-05-08 13:23 编辑
网络是这样的
1. client位于局域网内,经路由器连接到外网
2. server直接连接在外网上
程序步骤:
1. client 监听33333 udp端口
2. server 监听22222 udp端口
3. client 绑定33333端口,发送udp数据包到 server的22222端口
4. server收到数据后,向 “它看到的client ip和端口" 发回数据
这里, “它看到的client ip和端口",是NAT转换后的ip和端口。
5. client收到server发回的数据
问题:
自己用路由器架设网络,这样是可以发回的。
但是我将server放到真正的公网上的服务器,
只能接收到client发送的数据,数据无法发回到client。
大家帮我看看,是程序有问题,还是公网服务器的网络有问题。
程序如下,简单起见,不用C写了,用nodejs模拟了下
server代码
- var dgram = require('dgram');
- var socket = dgram.createSocket('udp4');
- socket.on('message', function (message, remote) {
- //发送回应
- console.log('client ip:' + remote.address + ', port:' + remote.port +', message:' + message);
- var message = new Buffer("hello, client!");
- socket.send(message, 0, message.length, remote.port, remote.address);
- });
- //监听端口
- socket.bind(22222);
复制代码 client代码
- var dgram = require('dgram');
- var socket = dgram.createSocket('udp4');
- socket.on('message', function (message, remote) {
- //显示server发回的消息
- console.log('server ip:' + remote.address + ', port:' + remote.port +', message:' + message);
- });
- //监听端口
- socket.bind(33333);
- //发送消息
- function send(server){
- var message = new Buffer("hello, server!");
- socket.send(message, 0, message.length, 22222, server, function(){
- //1秒后再次发送
- setTimeout(function(){
- send(server);
- }, 1000);
- });
- };
- //send("127.0.0.1");
- //假设公网服务器为public.server.com
- send("public.server.com");
复制代码 |
|