路由器添加端口映射以及虚拟服务器均无效....

wwwww112233 2014-05-04 09:07:12



无论添加端口映射还是添加虚拟服务器,在tcp下可以正常使用,在udp下均无法实现转发。
客户端
static void Main(string[] args)
{
Console.WriteLine("This is a Client, host name is {0}", Dns.GetHostName());

//设置服务端终结点
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("我的互联网ip"), 1688);

//创建与服务端连接的套接字,指定网络类型,数据连接类型和网络协议
Socket ConnSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

string welcome = "Client Message:Hello!!!";
byte[] data = new byte[1024];
data = Encoding.ASCII.GetBytes(welcome);

//给服务端发送测试消息
ConnSocket.SendTo(data, data.Length, SocketFlags.None, ipe);
IPEndPoint server = new IPEndPoint(IPAddress.Any, 0);
//服务端终结点
EndPoint Remote = (EndPoint)server;

data = new byte[1024];
//对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制
//server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 100);
int recv = ConnSocket.ReceiveFrom(data, ref Remote);
//打印从服务端发回的信息
Console.WriteLine("Message received from {0}: ", Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
while (true) //可以实时给服务端发送消息
{
string input = Console.ReadLine();
if (input == "exit") //中断连接
{
ConnSocket.SendTo(Encoding.ASCII.GetBytes(input), Remote);
data = new byte[1024];
recv = ConnSocket.ReceiveFrom(data, ref Remote);
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
break;
}
else
{
ConnSocket.SendTo(Encoding.ASCII.GetBytes("Client Message:" + input), Remote);
data = new byte[1024];
recv = ConnSocket.ReceiveFrom(data, ref Remote);
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
}
}
Console.WriteLine("Stopping Client.");
ConnSocket.Close();
}


服务端
static void Main(string[] args)
{
//设置“终结点”
IPEndPoint ipe = new IPEndPoint(IPAddress.Any, 1899);
//创建与客户机连接的套接字(基于UDP协议无需侦听Socket)
Socket ConnSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//绑定网络地址
ConnSocket.Bind(ipe);

Console.WriteLine("This is a Server, host name is {0}", Dns.GetHostName());
//等待客户机连接
Console.WriteLine("Waiting for a client");

IPEndPoint client = new IPEndPoint(IPAddress.Any, 0);
//客户机终结点
EndPoint Remote = (EndPoint)(client);
byte[] data = new byte[1024];
//从客户机接收信息,并将信息保存到数据缓冲区data
int recv = ConnSocket.ReceiveFrom(data, ref Remote);
//将接收的信息(客户机ip及端口号和文本信息)打印出来
Console.WriteLine("Message received from {0}: ", Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

//客户机连接成功后,发送欢迎信息
string welcome = "Server Message:Welcome!!!";
//字符串与字节数组相互转换
data = Encoding.ASCII.GetBytes(welcome);
//给客户机发送信息
ConnSocket.SendTo(data, data.Length, SocketFlags.None, Remote);
while (true) //时刻准备接收从客户机发回的信息
{
data = new byte[1024];
recv = ConnSocket.ReceiveFrom(data, ref Remote);
if (Encoding.ASCII.GetString(data, 0, recv) == "exit")
{
Console.WriteLine("Client has been exit from the connection.");
//给客户机发送一条"exit"消息表示欲关闭连接
welcome = "Server exit!!!";
data = Encoding.ASCII.GetBytes(welcome);
ConnSocket.SendTo(data, data.Length, SocketFlags.None, Remote);
ConnSocket.Close();
break;
}
else
{
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
//告知客户机当前信息已成功接收
welcome = "Server has been received successfully!!!";
data = Encoding.ASCII.GetBytes(welcome);
ConnSocket.SendTo(data, data.Length, SocketFlags.None, Remote);
}
}
}


我想实现一个主机往局域网中的某个电脑发送udp消息,可这个虚拟服务器一直不能成功。我试过用tcp可以成功,但是udp一直不行。不知道是什么原因,谢谢!!
...全文
598 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 5 楼 qq443061626 的回复:
1.虚拟服务器添加端口 2.确认是否开启了防火墙(开启了需要添加1899入站规则) //没有添加防火墙会禁止,无法通讯 3.客户端连接的时候IP地址为:联网IP(电信局的):1899端口为1899 4.服务器显示客户端连接的端口,虚拟主机里面是否指定了,没指定是无法互相通讯的。除非:设置-->当一个外来的数据包没有重定向到任何虚拟服务器的时候,那么该数据包将被:不要设置丢弃,设置你指定的服务器IP即可
追加: 根据第4条设置的话,必须关闭防火墙;UDP连接的客户端不能通讯,端口被防火墙禁止掉了
  • 打赏
  • 举报
回复
1.虚拟服务器添加端口
2.确认是否开启了防火墙(开启了需要添加1899入站规则) //没有添加防火墙会禁止,无法通讯
3.客户端连接的时候IP地址为:联网IP(电信局的):1899端口为1899
4.服务器显示客户端连接的端口,虚拟主机里面是否指定了,没指定是无法互相通讯的。除非:设置-->当一个外来的数据包没有重定向到任何虚拟服务器的时候,那么该数据包将被:不要设置丢弃,设置你指定的服务器IP即可
wwwww112233 2014-05-05
  • 打赏
  • 举报
回复
引用 3 楼 tcmakebest 的回复:
UDP服务需要这么复杂么?
System.Net.Sockets.UdpClient uc = new System.Net.Sockets.UdpClient(5678);
IPEndPoint ip = new IPEndPoint(IPAddress.Any, 0);
byte[]data = uc.Receive(ref ip);
谢谢,服务器不是不能运行,在本地通信是正常运行的。但是添加虚拟服务器后,在互联网下,就无法通信。不知是什么问题
tcmakebest 2014-05-05
  • 打赏
  • 举报
回复
UDP服务需要这么复杂么?
System.Net.Sockets.UdpClient uc = new System.Net.Sockets.UdpClient(5678);
IPEndPoint ip = new IPEndPoint(IPAddress.Any, 0);
byte[]data = uc.Receive(ref ip);
wwwww112233 2014-05-04
  • 打赏
  • 举报
回复
上面 IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("我的互联网ip"), 1688); 这个实际代码是 1899端口,这里没有写错。复制代码的时候搞错了
wwwww112233 2014-05-04
  • 打赏
  • 举报
回复

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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