【发布时间】:2015-06-08 11:05:39
【问题描述】:
我正在编写一个 c# tcp 套接字服务器,它将从 c++ 套接字应用程序接收数据。现在一切正常,除了我的 c# 接收线程中的循环中断逻辑。我在下面显示一个代码 sn-p 以便更好地解释。
//creating socket object
private Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//accepting connections
TcpListener tcpListener = new TcpListener(ipAdd, iPort);
tcpListener.Start();
this.socket = tcpListener.AcceptSocket();
tcpListener.Stop();
//code for
//public byte[] ReceiveMessage(ref int intError)
while (this.socket.Available > 0)
{
try
{
intBytesReceived = this.socket.Receive(byteReceivedBuffer, byteReceivedBuffer.Length, SocketFlags.None);
Thread.Sleep(100);
}
catch (SocketException ex)
{
string str = ex.Message;
intError = -1;
}
}
下面是连续接收数据的线程函数
//Thread to continuous poll data from client
//Now this has been done as I need to receive multiple messages from client after server ack received at client side.
//Thread quit logic based on manual stop button press
//I want to have one more logic by which thread will exit if the connection closed by client socket. i.e. a call of 'CloseSocket()' function from c++ application.
if (TCPServerListener.serverStatus == TCPServerListener.ServerStatus.Stopped)
{
tcpCommunication.Disconnect();
break;
}
while(true)
{
int sockError = 0;
byte[] byteData = tcpCommunication.ReceiveMessage(ref sockError);
if (byteData.Length > 0)
{
ParseBuffer(byteData, ref tcpCommunication);
}
}
为了获得更好的图片,我正在使用我的通信协议。
- 客户端启动连接。发送数据集
- 服务器接收、处理、发送确认
- 客户端处于暂停模式,直到它收到来自服务器的确认,但没有关闭套接字
- 这一次,服务器不会收到任何消息,但接收线程应该处于活动状态,因为我正在为每个客户端创建一个线程。
- 一旦客户端收到确认,它将继续发送下一个数据
- 服务器接收线程现在将获取数据并进行相应处理
- 一旦客户端关闭其套接字,服务器接收线程也应该关闭
我能够完成我的工作,但服务器接收器线程没有关闭。那是我的问题。任何建议都会有很大帮助。
【问题讨论】:
-
也许你应该对 sockError 做点什么?而且很多时候如果接收到的数据长度为负数,也是连接关闭的标志。取决于 tcpCommunication 实际上是什么。这样你就可以跳出线程了。
-
嗯,我在考虑 15 秒或更多的超时值。因为我的客户不会等待超过 3 秒的单次数据发送和确认接收。因此,如果服务器连续 15 秒没有收到任何数据,它将假定客户端已关闭连接。但这对于实时应用程序来说听起来不错吗?
-
既然 TCP 已经告诉你连接是否已经关闭,为什么还要超时呢?除非客户端有可能只是闲逛而不发送任何东西,而不是关闭套接字(崩溃也会导致套接字关闭)。
-
如何查看客户端是否关闭了套接字?那是我的实际问题。客户端连接关闭时没有触发 SocketException / 异常。
-
这取决于您使用的是什么。 tcpCommunication 可能会告诉你,但我不可能说,因为我不知道它是什么类型的对象。在最低级别
Socket将有关于打开或关闭的信息,通常读取操作将在连接关闭时返回