我应该如何检查(TCP)套接字以确定它是否已连接?
我已经阅读了MSDN中的Socket.Connected属性,但它说它只根据最后一个I/O显示状态.这对我没用,因为我想在尝试从套接字读取之前这样做.备注部分还指出:
如果需要确定连接的当前状态,请进行非阻塞,零字节发送调用.如果调用成功返回或抛出WAEWOULDBLOCK错误代码(10035),则套接字仍然连接; 否则,套接字不再连接.
同一页面上的示例显示了如何执行此操作.(1)但Ian Griffiths的帖子说我应该从套接字读取,而不是通过它发送.
...在你打电话之后
Shutdown(),打电话Receive()直到它返回0(假设远程端点实际上不会向你发送任何东西,一旦远程端点收到你的所有数据就会发生这种情况).除非您这样做,否则您无法保证远程端点实际上已收到您发送的所有数据,即使使用延迟套接字也是如此.
我真的不明白他关于调用Receive()以确保远程端点实际上已经收到我发送的所有数据的说法.(套接字阻塞接收,直到发送缓冲区为空?)
我对提出的不同方法感到困惑.你能解释一下吗?
(1)但不知为何,例如为Socket.Connected属性分配1字节的数组,即使它调用Send与0长度?
我有以下异步TCP服务器,我用它来接受来自想要上传文件的客户端的传入请求.大约1-4小时后,服务器只是停止接受任何新连接.这让我感到困惑,因为我无法确定性地重现错误.程序中的其余线程继续正常运行.没有任何例外.关于可能发生什么的任何建议?
在服务器崩溃之前,我所看到的是它设法完成待处理的请求然后停止.我怀疑服务器是否经常出现网络断开连接.如何使这段代码对故障更加健壮?我已经将try-catch添加到可能会失败的两段代码中,但我觉得我仍然缺少某些东西.
我设置另一个线程来检查此服务器是否释放套接字,但即使在它停止处理客户端请求后,套接字似乎仍在使用中.我用这个验证了这个netstat -a
internal class TCPServer
{
private readonly int _listeningPort;
private TcpListener listener;
public TCPServer(int port)
{
_listeningPort = port;
listener = new TcpListener(IPAddress.Any, _listeningPort);
listener.Start(int.MaxValue);
}
public async void Start()
{
while (true)
{
Log.Verbose("Waiting for connections...");
try
{
var tcpClient = await listener.AcceptTcpClientAsync();
Task t = HandleConnectionAsync(tcpClient);
await t;
}
catch (Exception exp)
{
Log.Fatal(exp.ToString());
}
}
}
private async Task HandleConnectionAsync(TcpClient tcpClient)
{
try
{
string outputFile = ""; // get a random string …Run Code Online (Sandbox Code Playgroud)