我正在构建一个C#聊天程序,但我遇到了外部连接问题 . 当同一台计算机同时连接服务器和客户端时,似乎没有问题,但是当我尝试在一台计算机上托管连接时,另一台计算机无法作为客户端连接 . 这里是相关的代码:class Server: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();
}
我不知道这里有什么问题 . 希望你能告诉我什么是错的 .
2 回答
您的问题可能与代码无关 . 为了让网络外的其他人能够连接到您,您需要在路由器上移植您正在连接的端口 . 你可以找到很多教程here . 您还可以通过this工具检查您的连接是否已打开 .
来自维基百科:
您必须允许通过路由器的连接才能连接到聊天服务器 .
您需要为计算机提供公共IP地址(可能是您的路由器有此选项)或在路由器上实现端口转发 .
公共IP地址将是您的路由器之一 . 看看这个网站,找出你的公共IP whatismyipaddress.com . 您的路由器可以支持也可以不支持将其公共IP地址提供给您的计算机,但是,您的路由器应该能够进行端口转发 . (将数据从特定端口转发到特定计算机,因此当有人连接到您的公共IP时 . 例如
93.93.93.93:3333
将被转发到您的PC . )