У меня есть клиент C # и отдельное серверное приложение.Когда я выполняю оба на одной машине, я могу подключиться к серверу.Однако, когда я пытаюсь подключиться к своему серверу удаленно, это всегда заканчивается тайм-аутом.Я использую порт 139, и я попытался запустить серверное приложение на нескольких компьютерах.Я пробовал это на сервере, который открыт для общественности, на моем частном ПК с маршрутизатором, пересылающим этот порт на ПК, а также на ноутбуках в той же сети.Я всегда проверял, прослушивает ли компьютер, на котором работает сервер, порт netstat -an и делал исключения в брандмауэре для всех из них.Код, который я использую на клиенте для подключения к серверу:
static IPHostEntry ipHostInfo = Dns.GetHostEntry("xxx.xxx.xxx.xxx");
static IPAddress ipAddress = ipHostInfo.AddressList[0];
static IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);
static Socket client = new Socket(ipAddress.AddressFamily,
SocketType.Stream, ProtocolType.Tcp);
static private void ConnectToServer()
{
try
{
client.BeginConnect(remoteEP,
new AsyncCallback(ConnectCallback), client);
connectDone.WaitOne();
}
catch (Exception ex)
{
Console.WriteLine("Error: ", ex.ToString());
}
}
private static void ConnectCallback(IAsyncResult ar)
{
try
{
// Retrieve the socket from the state object.
Socket client = (Socket)ar.AsyncState;
// Complete the connection.
client.EndConnect(ar);
Console.WriteLine("Socket connected to {0}",
client.RemoteEndPoint.ToString());
// Signal that the connection has been made.
connectDone.Set();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
Код, который я использую для подтверждения соединения на сервере:
static IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
static IPAddress ipAddress = ipHostInfo.AddressList[0];
static IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 139);
static Socket listener = new Socket(ipAddress.AddressFamily,
SocketType.Stream, ProtocolType.Tcp);
try
{
listener.Bind(localEndPoint);
listener.Listen(100);
while (true)
{
allDone.Reset();
Console.WriteLine("Listening on: " + ipAddress);
listener.BeginAccept(
new AsyncCallback(AcceptCallback),
listener);
allDone.WaitOne();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
static void AcceptCallback(IAsyncResult ar)
{
allDone.Set();
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);
StateObject state = new StateObject();
state.workSocket = handler;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
}
Как я уже сказал, это работает безупречно, когдаклиентское и серверное приложение выполняются на одном компьютере.Однако, если они находятся на разных компьютерах, клиент получает ошибку тайм-аута в течение нескольких секунд.
Любая помощь приветствуется, спасибо.