gpt4 book ai didi

c# - C#TcpSockets是否以干净/正确的方式断开连接?

转载 作者:行者123 更新时间:2023-12-03 12:00:28 24 4
gpt4 key购买 nike

所以我知道有很多关于该主题的文章,我确实读了很多我会说的文章,但是由于某种原因,我确定我的代码没有执行应做的事情。

我想关闭服务器与客户端之间的连接。
现在在服务器端,我使用以下代码启动断开连接

public void shutdown()
{
_socket.Shutdown(SocketShutdown.Both);
_socket.Close();
}

在客户端,我在理解如何断开连接时遇到了一些麻烦,我认为正在发生的事情如下:在我的异步接收回调中,由于服务器启动了关闭序列,因此我应该得到一个错误,并且我必须处理该错误(正确???),所以我为客户编写的代码如下所示:
ReceiveCallback:
private void ReceiveCallback(IAsyncResult result)
{
int bytesRecieved = 0;
byte[] tempBuff;

//Try to receive But if a Socket error occures disconnect otherwise start Receiving again
try
{
bytesRecieved = _socket.EndReceive(result);
}
catch (SocketException sockEx)
{
Disconnect(sockEx);
return;
}
catch (ObjectDisposedException disposeEx)
{
Disconnect(disposeEx);
return;
}
catch (Exception ex)
{
StartReceive();
return;
}

if (bytesRecieved == 0)
{
StartReceive();
return;
}

tempBuff = new byte[bytesRecieved];
Buffer.BlockCopy(_buffer, 0, tempBuff, 0, bytesRecieved);
StartReceive();
_packHandler.handlePacket(tempBuff);

}

断开:
public void Disconnect()
{
if (!_socket.Connected)
{
return;
}
_socket.BeginDisconnect(false, DisconnectCallback, null);
}

断开回调
private void DisconnectCallback(IAsyncResult result)
{
_socket.EndDisconnect(result);
_socket.Close();
}

(Disconnect方法已重载,因此,如果我遇到异常,它将显示一个messageBox,然后再调用Disconnect。这样我就知道发生了什么。)

我在哪里错了,我该如何改善uppon?

我尝试了代码,它似乎可以正常工作,但是如果所有套接字都关闭了,而客户端套接字没有关闭,我便用netstat进行了查找。是在FIN_WAIT_2中,这意味着它(或服务器??)尚未发送FIN数据包,对吗?
哦,然后我改变了这一行再次尝试:
if (bytesRecieved == 0)
{
StartReceive();
return;
}


if (bytesRecieved == 0)
{
Disconnect;
return;
}

然后在服务器端抛出了一个异常,在客户端,客户端说该连接已被服务器关闭了?

编辑:即使我已经关闭了两个程序,Netstat仍显示端口处于WAITING状态。这告诉我什么?

最佳答案

正常的断开连接具有关闭状态,它将清除套接字,以便可以正确断开连接,但是异步样式永远不会调用关闭状态。我在下面的方便位置添加了它。

public void Disconnect()
{
if (!_socket.Connected)
{
return;
}
_socket.Shutdown(SocketShutdown.Both); // Make sure to do this
_socket.BeginDisconnect(false, DisconnectCallback, null);
}

编辑:

从它的声音来看,您没有理由使用异步方法吗?异步方法是这样,因此您可以在单独的执行线程中发送数据,从而释放线程以进行某些数据处理(例如在发生这种情况时)。

我看不到正在进行任何处理,因此我建议您像这样更改断开连接,看看它是否可以解决问题。因为我不认为您正在等待异步方法,所以效果不佳。
public void Disconnect()
{
if (!_socket.Connected)
{
return;
}
shutdown(); //Your standard disconnect that you showed up top. Scoping might be required.
}

关于异步的一些数据可以在这里查看: http://msdn.microsoft.com/en-us/library/38dxf7kt(v=vs.110).aspx

关于c# - C#TcpSockets是否以干净/正确的方式断开连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25933230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com