Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TCPServer AcceptSocket()挂起,即使存在挂起的连接_C#_Sockets_Tcp_Tcplistener - Fatal编程技术网

C# TCPServer AcceptSocket()挂起,即使存在挂起的连接

C# TCPServer AcceptSocket()挂起,即使存在挂起的连接,c#,sockets,tcp,tcplistener,C#,Sockets,Tcp,Tcplistener,我有一个TCPServer正在运行以接收文件,它99%的时间都能工作,但有时(似乎是随机的)它会挂在AcceptSocket()行上,即使我等待Pending()标志为真。下面是我为服务器使用的代码。(我知道Thread.Sleep()是个问题,但这不是问题所在……我不认为) //等待文件连接 int=0;bool timeout=false;int超时=60000; while(fileServer.Pending()==false&&(已用时间超时) 超时=真; } 如果(超时) { Pro

我有一个
TCPServer
正在运行以接收文件,它99%的时间都能工作,但有时(似乎是随机的)它会挂在
AcceptSocket()
行上,即使我等待
Pending()
标志为真。下面是我为服务器使用的代码。(我知道
Thread.Sleep()
是个问题,但这不是问题所在……我不认为)

//等待文件连接
int=0;bool timeout=false;int超时=60000;
while(fileServer.Pending()==false&&(已用时间<超时))
{
睡眠(1000);
时间+=1000;
如果(经过>超时)
超时=真;
}
如果(超时)
{
Program.EventMessage(“文件服务器超时,未收到文件”);
传入的_文件=false;
继续;
}
Program.EventMessage(“打开套接字”);
fileSocketForClient=fileServer.AcceptSocket();
基本上,因为这段代码确实有效。什么会导致
AcceptSocket()
挂起的问题,即使它有一个挂起的连接

是否需要检查套接字是否阻止我实现超时

我希望套接字保持阻塞状态,因为应用程序的其余部分确实需要完成此操作才能向前移动,它只需要一个超时或其他什么,因此如果它确实出现问题,则可以恢复,而无需手动重新启动整个程序

发现了问题,我知道需要做什么来修复它(timeout
AcceptSocket()
),但四处搜寻,所以我还没有找到可行的方法来解决

作为临时的创可贴,我已经把它移动到多线程,所以至少当它死时,服务器仍然可以去…只有永久阻塞线程需要处理。

连接挂起。这是否意味着稍后仍将挂起连接?不,状态函数不能预测未来

“我足够聪明,可以想尽一切可能阻止套接字操作的方法,并确保不会发生这种情况,因此我可以使用阻止套接字操作,并确保它们永远不会阻止。”不,你没有。不要尝试。这行不通。使用非阻塞套接字操作。

连接挂起。这是否意味着稍后仍将挂起连接?不,状态函数不能预测未来


“我足够聪明,可以想尽一切可能阻止套接字操作的方法,并确保不会发生这种情况,因此我可以使用阻止套接字操作,并确保它们永远不会阻止。”不,你没有。不要尝试。这行不通。使用非阻塞套接字操作。

挂起的
调用不能预测未来。连接在过去处于挂起状态并不保证该连接在以后仍处于挂起状态。如果您想要不阻塞的套接字操作,请使用不阻塞的套接字操作。但挂起的调用将确定它是否有传入连接。没有?当它回来的时候,是的。但这并不能预测未来。稍后连接可能不会挂起,比如说因为另一方关闭了它。如果您想要非阻塞套接字操作,请使用非阻塞套接字操作。您真正的问题是“如何使AcceptSocket超时?”。由于睡眠,您的代码目前处于阻塞状态,因此非阻塞不能成为您的目标。这正是我想要实现的目标,是的。
挂起的
调用无法预测未来。连接在过去处于挂起状态并不保证该连接在以后仍处于挂起状态。如果您想要不阻塞的套接字操作,请使用不阻塞的套接字操作。但挂起的调用将确定它是否有传入连接。没有?当它回来的时候,是的。但这并不能预测未来。稍后连接可能不会挂起,比如说因为另一方关闭了它。如果您想要非阻塞套接字操作,请使用非阻塞套接字操作。您真正的问题是“如何使AcceptSocket超时?”。由于睡眠问题,您的代码目前处于阻塞状态,因此非阻塞不能成为您的目标。这正是我想要实现的目标,是的。我希望得到投票人的解释。如果我不清楚,我想知道需要澄清什么。如果我不正确,我想知道怎么做。David,建议你使用线程,你会从孩子那里得到大量的重复。虽然它确实让你了解可能发生的事情,但这并不能回答我的问题。答案是使用非阻塞套接字操作,正如我所说的。阻止套接字操作几乎是不可能正确的。我希望得到投票人的解释。如果我不清楚,我想知道需要澄清什么。如果我不正确,我想知道怎么做。David,建议你使用线程,你会从孩子那里得到大量的重复。虽然它确实让你了解可能发生的事情,但这并不能回答我的问题。答案是使用非阻塞套接字操作,正如我所说的。阻塞套接字操作几乎不可能正确进行。
// wait for the file connection
int elapsed = 0; bool timeout = false; int overtime = 60000;
while (fileServer.Pending() == false && (elapsed < overtime))
{
    Thread.Sleep(1000);
    elapsed += 1000;

    if (elapsed > overtime)
       timeout = true;
}

    if (timeout)
    {
       Program.EventMessage("FILE SERVER TIMEOUT, NO FILE RECIEVED");
       incoming_file = false;
       continue;
    }

Program.EventMessage("OPENING SOCKET");
fileSocketForClient = fileServer.AcceptSocket();