c# - 为什么 tcp 请求仅在它是环回请求时才有效?
问题描述
我在 C# 中有这个问题,如果我发出环回 (127.0.0.1) tcp 请求,我可以连接到同一台 PC 上的服务器并发送数据,但如果我尝试从同一网络上的另一台设备连接它不会不工作。还尝试在客户端将 IP 更改为网络一(192.168.43.58),但即使它在同一设备上,它也仅在 IP 是环回 IP 时才有效。还尝试使用我的智能手机作为路由器创建一个新网络,以防对方有一些防火墙或类似的东西但同样的问题。
客户端(软件和服务器在同一台设备上,ip绝对正确,错误码是:10061)
class Program
{
static void Main(string[] args)
{
while (true)
{
Console.Write("Messaggio? ");
String messaggio = Console.ReadLine();
string sRisultato = TCPUtils.getData(new TcpClient("192.168.43.58", 8888), messaggio);
Console.WriteLine(sRisultato);
Console.WriteLine();
}
}
}
服务器
class Program
{
static void consoleLog(string msg)
{
msg = String.Format("[{0}] - {1}", DateTime.UtcNow.ToString(), msg);
Console.WriteLine(msg);
}
static void Main(string[] args)
{
String host = "127.0.0.1";
int portnum = 8888;
TcpListener server = new TcpListener(IPAddress.Parse(host), portnum);
consoleLog("------------------------------------------------");
consoleLog("Server Accept client on port: " + portnum.ToString());
consoleLog("------------------------------------------------");
server.Start();
while (true)
{
using (TcpClient client = server.AcceptTcpClient())
{
consoleLog("Connected! from " + client.Client.RemoteEndPoint.ToString());
//stuff
client.Close();
consoleLog("Closed ------------------------------------------");
}
}
}
}
解决方案
TL;博士
尝试将您的服务器托管在0.0.0.0
.
解释:
服务器托管在环回 IP 上。如果您检查ipconfig
或ifconfig
根据您的操作系统,您会看到分配给您的系统的多个 IP。所有这些 IP 都属于它们在系统上的物理或虚拟接口。例如:
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet 127.0.0.1 netmask 0xff000000
...
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255
....
vboxnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.56.1 netmask 0xffffff00 broadcast 192.168.56.255
它们都充当不同的门来接受流量。您可以在其他人不知道的情况下将流量发送到单个接口和从单个接口。
您正在(环回)接口上127.0.0.1
或上运行您的服务器。lo0
这意味着仅在lo0
接口或127.0.0.1
IP 地址上接受流量。如果您将服务器托管在 上192.168.0.2
,那么您将只能访问该特定 IP 上的套接字。
$ http-server -a 192.168.0.2
Starting up http-server, serving ./
Available on:
http://192.168.0.2:8080
Hit CTRL-C to stop the server
接着
$ nc -v 127.0.0.1 8080
nc: connectx to 127.0.0.1 port 8080 (tcp) failed: Connection refused
你可以试试上面的实验。
您可以使用特定 IP 来侦听或告诉您的服务器侦听您拥有的所有接口0.0.0.0
。这有着特殊的意义。
$ http-server -a 0.0.0.0
Starting up http-server, serving ./
Available on:
http://127.0.0.1:8080
http://192.168.0.2:8080
http://192.168.56.1:8080
Hit CTRL-C to stop the server
然后您可以连接到其中的任何一个。
推荐阅读
- javascript - JS/ES6/lodash 查找两个多维数组缺失元素的索引
- html - 带有非字母字符的烧瓶静态图像文件名不起作用
- sql - 如果我可以在一个程序中做我需要的所有事情,我为什么要使用触发器呢?
- android - 我什么时候可以添加应用内购买?谷歌安卓应用商店
- bash - Problem getting `jq` and `watch` to play together nicely?
- geometry - 如何快速识别具有角度阈值的单位向量?
- python - 输出结合所有学生的分数,而不是重复后的一个列表
- java - 无法为 Hibernate 解析符号“AnnotationConfiguration”
- python - 为什么while循环不再运行?
- mysql - 具有空值的 Mysql EF Core char 列抛出 ArgumentOutOfRangeException