Я пытаюсь подключиться к удаленному серверу, используя сокет TCP.У меня есть IP и номер порта.После подключения мне нужно отправить что-то вроде сообщения «setup».Чтобы сообщить ему, какие данные я буду слушать.И мне нужно держать эту связь открытой.Для "пинга".Рекомендуемый способ «пингования» - это отправлять (каждые 3-5 секунд) нейтральное сообщение (т.е. запрашивать номер версии сервера).
Сервер отвечает, конечно.Некоторые ответы следуют за сообщениями запроса (иногда сразу, иногда с задержкой - если запрос требует обработки).И некоторые ответы без каких-либо запросов (например, объявления о запланированной перезагрузке сервера и т. Д.).
Пока у меня есть доступ только для просмотра к консоли этого сервера.Поэтому я могу наблюдать за моими попытками связи и за тем, как сервер реагирует на них.
Простая инициализация:
m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
m_Socket.Connect(hostIp, hostPort);
if(m_Socket.Connected)
{
sendSetupMessage(m_Socket); // that message is correctly received by server
startPingingThread(m_Socket); // pings are correctly received by server
startListening(m_Socket.LocalEndPoint); // that part is not working
}
Я не могу сделать работающий слушатель.Вот что я сделал:
void startListening(EndPoint localEP)
{
Console.WriteLine("Listener starting");
Socket listener = new Socket(localEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try
{
listener.Bind(localEP);
listener.Listen(100);
while (true)
{
Socket handler = listener.Accept();
// application never goes beyond this point
Console.WriteLine("Listener accepted");
// ...
}
}
catch (Exception ex)
{
Console.WriteLine("Receiving error: " + ex.Message);
}
}
}
Этот слушатель полностью глухой.Там нет ошибки.Он просто останавливается на слушателе. Accept ();и остается там навсегда.И я точно знаю, что сервер отправляет правильные ответы.Я даже могу наблюдать кучу сообщений, которые продолжают накапливаться на стороне сервера, потому что мой клиент не обрабатывает должным образом ни одно из них.
Конечно, сервер не является проблемой.Он работает в течение многих лет, и есть клиенты по всему миру, которые обращаются к нему каждый день.
Я подозреваю, что проблема может быть связана с необходимостью создания отдельного сокета для прослушивания.Даже если он связан с локальной конечной точкой основного сокета.Однако в C # я не могу сделать это:
m_Socket.Connect(...);
m_Socket.Listen(...);
, поскольку возникает исключение, что один и тот же сокет не может быть одновременно подключен и использован для прослушивания.Я уже попробовал TcpClient и могу использовать NetworkStream как для отправки, так и для прослушивания.Я все еще пытаюсь выяснить, почему не работает подход Socket.