前两天在学习Socket的时候发现一个问题:
public void Start(string host,int port)
{
conns = new Conn[maxConn];
for (int i = 0; i < maxConn; i++)
{
conns[i] = new Conn();
}
listenfd = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipAdr = IPAddress.Parse(host);
IPEndPoint ipEp = new IPEndPoint(ipAdr, port);
listenfd.Bind(ipEp);
listenfd.Listen(maxConn);
listenfd.BeginAccept(AcceptCb, null);
Console.WriteLine("服务器启动:"+listenfd.LocalEndPoint.ToString());
}
在上述代码中,服务端于客户端均在本地计算机时,“host”传参数为“127.0.0.1”,网络通信正常:
恰好本人手里有台云服务器,就想测试一下真正的公网通信时,发现问题:
服务端代码部署在云服务器上时,输入公网IP无法正常启动监听。
GPT的解释是这样的:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
class Program
{
static void Main()
{
try
{
// 服务器监听的本地IP地址和端口
string serverIP = "0.0.0.0"; // 0.0.0.0 表示监听所有可用的网络接口
int serverPort = 12345;
// 创建套接字
Socket listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 设置服务器IP地址和端口
IPAddress ipAddress = IPAddress.Parse(serverIP);
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, serverPort);
// 绑定套接字到本地IP地址和端口
listenerSocket.Bind(localEndPoint);
// 开始监听传入的连接
listenerSocket.Listen(10); // 10 是等待连接队列的最大长度
Console.WriteLine("服务器启动,等待连接...");
while (true)
{
// 接受一个连接,返回一个新的Socket对象
Socket clientSocket = listenerSocket.Accept();
// 创建一个新线程来处理客户端连接
Thread clientThread = new Thread(HandleClient);
clientThread.Start(clientSocket);
}
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
static void HandleClient(object obj)
{
Socket clientSocket = (Socket)obj;
try
{
// 获取客户端的IP地址
string clientIP = ((IPEndPoint)clientSocket.RemoteEndPoint).Address.ToString();
Console.WriteLine($"客户端 {clientIP} 连接成功");
// 在这里可以添加处理客户端连接的逻辑
// 例如,接收和发送数据
// 关闭客户端套接字
clientSocket.Close();
Console.WriteLine($"客户端 {clientIP} 断开连接");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
按照GPT的给出的答案,将IP地址改为“0.0.0.0” 启动监听并链接成功,网络通信正常。但是依然没有解决我的疑问,
在这之后,我百度、Google、改服务器安全组、开放接口、检查防火墙,来来回回试了好几遍,最后的最后,找到我计算机在读研究生的弟弟求助之后发现问题:
啧,如果这个定义你跟我一样没看太懂没关系,这是GPT的解释:
所以,Socket服务端启动监听时直接传服务器的局域网IP(192.168.X.X)或“0.0.0.0”即可。公网IP是不支持的。结案!!!