为什么我的服务器 TcpListener 使用本地地址而不是 Public 地址? - 异常:请求的地址在其上下文中无效
Why is my Server TcpListener Working with Local Address but not with Public Address? - Exception: The requested address is not valid in its context
我使用 TcpListener 和 TcpClient 在 C# 中编写了一个服务器和一个客户端程序,我希望它们交换一个字符串。如果两台 PC 连接到同一个网络并且我使用服务器的本地地址,它就可以工作,但是当 PC 连接到不同的网络并且我使用 public 地址时,它会给我以下错误:
Exception: System.Net.Sockets.SocketException (0x80004005): The requested address is not valid in its context
at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.Bind(EndPoint localEP)
at System.Net.Sockets.TcpListener.Start(Int32 backlog)
at System.Net.Sockets.TcpListener.Start()
at Server___Network_Class.Program.Main(String[] args) in D:\Server - Network Class\Program.cs:line 18
这个错误是指第18行,也就是myList.Start();但我不知道为什么会抛出这个异常。我打开了路由器端口并正确设置了 Windows 防火墙...
这是我写的服务器和客户端代码:
服务器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace Server___Network_Class {
class Program {
static void Main(string[] args) {
try {
IPAddress ipAddress = IPAddress.Parse("146.241.31.193"); //That's the public IP
//Initialize the listener
TcpListener myList = new TcpListener(ipAddress, 51328);
//Start listening the selected port
myList.Start();
Socket socket = myList.AcceptSocket();
ASCIIEncoding asen = new ASCIIEncoding();
socket.Send(asen.GetBytes("Can you read this?"));
socket.Close();
myList.Stop();
}
catch (Exception e) {
Console.WriteLine("Exception: " + e);
}
Console.ReadKey();
}
}
}
客户端
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace Client___Class_Network {
class Program {
static void Main(string[] args) {
try {
//Inizializzo il client
TcpClient client = new TcpClient();
//Cerco di connettermi al server
client.Connect("146.241.31.193", 51328); //IP and Port i want to connect to
//Stream sul quale inviare e ricevere i dati dal server
NetworkStream stream = client.GetStream();
Byte[] bytesRecived = new Byte[256];
int totBytesRecived = stream.Read(bytesRecived, 0, bytesRecived.Length);
String stringData = System.Text.Encoding.ASCII.GetString(bytesRecived, 0, totBytesRecived);
Console.Write(stringData);
client.Close();
}
catch (Exception e) {
Console.WriteLine("Exception: " + e);
}
Console.ReadKey();
}
}
}
只有服务器程序抛出该异常,客户端程序似乎正在运行文件...
你能帮我解决这个问题吗?我(几乎)在网上搜索过,但找不到任何有用的答案。
提前致谢!
public IP 地址真的可以在您的 Windows 机器上使用还是只能在路由器上使用?
在命令行 window 中 运行 ipconfig
时检查 public 地址是否出现。我的猜测是您需要在路由器中设置 NAT 端口转发并将应用程序设置为侦听路由器提供给 Windows 机器的 IP 地址。这样的 IP 地址通常以 10.
或 192.
.
开头
尝试将您的服务器绑定到地址 0.0.0.0
。这样,它无需任何配置即可监听您所有的网卡(WiFi、以太网)。
我使用 TcpListener 和 TcpClient 在 C# 中编写了一个服务器和一个客户端程序,我希望它们交换一个字符串。如果两台 PC 连接到同一个网络并且我使用服务器的本地地址,它就可以工作,但是当 PC 连接到不同的网络并且我使用 public 地址时,它会给我以下错误:
Exception: System.Net.Sockets.SocketException (0x80004005): The requested address is not valid in its context
at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.Bind(EndPoint localEP)
at System.Net.Sockets.TcpListener.Start(Int32 backlog)
at System.Net.Sockets.TcpListener.Start()
at Server___Network_Class.Program.Main(String[] args) in D:\Server - Network Class\Program.cs:line 18
这个错误是指第18行,也就是myList.Start();但我不知道为什么会抛出这个异常。我打开了路由器端口并正确设置了 Windows 防火墙... 这是我写的服务器和客户端代码:
服务器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace Server___Network_Class {
class Program {
static void Main(string[] args) {
try {
IPAddress ipAddress = IPAddress.Parse("146.241.31.193"); //That's the public IP
//Initialize the listener
TcpListener myList = new TcpListener(ipAddress, 51328);
//Start listening the selected port
myList.Start();
Socket socket = myList.AcceptSocket();
ASCIIEncoding asen = new ASCIIEncoding();
socket.Send(asen.GetBytes("Can you read this?"));
socket.Close();
myList.Stop();
}
catch (Exception e) {
Console.WriteLine("Exception: " + e);
}
Console.ReadKey();
}
}
}
客户端
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace Client___Class_Network {
class Program {
static void Main(string[] args) {
try {
//Inizializzo il client
TcpClient client = new TcpClient();
//Cerco di connettermi al server
client.Connect("146.241.31.193", 51328); //IP and Port i want to connect to
//Stream sul quale inviare e ricevere i dati dal server
NetworkStream stream = client.GetStream();
Byte[] bytesRecived = new Byte[256];
int totBytesRecived = stream.Read(bytesRecived, 0, bytesRecived.Length);
String stringData = System.Text.Encoding.ASCII.GetString(bytesRecived, 0, totBytesRecived);
Console.Write(stringData);
client.Close();
}
catch (Exception e) {
Console.WriteLine("Exception: " + e);
}
Console.ReadKey();
}
}
}
只有服务器程序抛出该异常,客户端程序似乎正在运行文件...
你能帮我解决这个问题吗?我(几乎)在网上搜索过,但找不到任何有用的答案。 提前致谢!
public IP 地址真的可以在您的 Windows 机器上使用还是只能在路由器上使用?
在命令行 window 中 运行 ipconfig
时检查 public 地址是否出现。我的猜测是您需要在路由器中设置 NAT 端口转发并将应用程序设置为侦听路由器提供给 Windows 机器的 IP 地址。这样的 IP 地址通常以 10.
或 192.
.
尝试将您的服务器绑定到地址 0.0.0.0
。这样,它无需任何配置即可监听您所有的网卡(WiFi、以太网)。