我正在构建一个C#聊天程序,但我遇到了外部连接问题。 当同一台计算机同时连接服务器和客户端时,似乎没有问题,但是当我尝试在一台计算机上托管连接时,另一台计算机无法作为客户端连接。 这是相关的代码: 类服务器: public void Connect(string ipAddr,string port) { server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, Convert.ToInt32(port));
server.Bind(ipLocal);//bind to the local IP Address...
server.Listen(5);//start listening...
// create the call back for any client connections...
server.BeginAccept(new AsyncCallback(OnClientConnect), null);
}
public void Disconnect()
{
server.Close();
server = null;
tempSocket = null;
}
public void OnClientConnect(IAsyncResult asyn)
{
try
{
if (server != null)
{
tempSocket = server.EndAccept(asyn);
WaitForData(tempSocket);
server.BeginAccept(new AsyncCallback(OnClientConnect), null);
}
}
catch (ObjectDisposedException)
{
Debugger.Log(0, "1", "OnClientConnect: Socket has been closed.");
}
catch (Exception e)
{
MessageBox.Show(e.Message, "OnClientConnect Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
客户端类: public void Connect(string ipAddr,string port) { client = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ipAddr),Convert.ToInt32(port)); client.Connect(IPE);
clientListener = new Thread(OnDataReceived);
isEndClientListener = false;
clientListener.Start();
}
我不知道这里有什么问题。希望你能告诉我什么是错的。
答案 0 :(得分:1)
您的问题可能与代码无关。为了让网络外的其他人能够连接到您,您需要在路由器上移植您正在连接的端口。您可以找到许多教程here。您还可以通过this工具检查您的连接是否已打开。
来自维基百科:
端口转发允许远程计算机(例如,Internet上的计算机)连接到专用局域网(LAN)内的特定计算机或服务。
您必须允许通过路由器的连接才能连接到聊天服务器。
答案 1 :(得分:0)
您需要为您的计算机提供公共IP地址(可能是您的路由器有此选项)或在您的路由器上实现端口转发。
公共IP地址将是您的路由器之一。查看此网站以查找您的公共IP whatismyipaddress.com。您的路由器可以支持也可以不支持将其公共IP地址提供给您的计算机,但是,您的路由器应该能够进行端口转发。 (将数据从特定端口转发到特定计算机,以便当有人连接到您的公共IP时。例如,93.93.93.93:3333
将转发到您的PC。)