我正在尝试使用TCP套接字将A连接到远程服务器。我有IP和端口号。连接后,我需要发送类似“设置”的消息。为了通知我将收听哪种数据。而且我需要保持此连接打开。用于“ ping”。推荐的“ ping”方式是发送(每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);
}
}
}
这个听众完全是聋子。没有错误。它只是在listener.Accept();处停止。永远呆在那里而且我可以肯定服务器正在发送正确的响应。我什至可以观察到一堆堆积在服务器端的消息,因为我的客户端没有正确处理它们。
确保服务器没有问题。它运行了很多年,每天都有世界各地的客户在访问它。
我怀疑问题可能是由于有必要创建一个单独的套接字进行监听的缘故。即使绑定到主套接字的本地端点。但是,在C#中,我无法做到这一点:
m_Socket.Connect(...);
m_Socket.Listen(...);
因为它引发了一个例外,即同一套接字不能同时连接和用于侦听。我已经尝试过TcpClient,并且可以使用NetworkStream进行发送和侦听。我仍在尝试弄清楚为什么Socket方法不起作用。