当前位置: 首页 > 知识库问答 >
问题:

TCP套接字停止接收数据直到关闭

宗项禹
2023-03-14

我有一个很奇怪的问题快把我逼疯了。

我有一个Rubyhtml" target="_blank">服务器和一个Flash客户端(动作脚本3)。这是一个多人游戏。

问题是,一切都在完美地工作,然后,突然,一个随机的球员停止接收数据。当服务器因为不活动而关闭连接时,大约20-60秒后,客户端接收到所有缓冲的数据。

socket.addEventListener(Event.CONNECT, connectHandler);
function connectHandler(event)
{
    sendData(sess);
}

function sendData(dat)
{
    trace("SEND: " + dat);
    addDebugData("SEND: " + dat)
    if (socket.connected) {
        socket.send(dat);
    } else {
        addDebugData("SOCKET NOT CONNECTED")
    }
}

socket.addEventListener(DataEvent.DATA, dataHandler);
function dataHandler(e:DataEvent) {
    var data:String = e.data;
    workData(data);
}
sock.write(data + DATAEOF)
sock.flush()
newsock = serverSocket.accept
newsock.sync = true
newsock.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, true)
    null

我不认为这是一个操作系统/网络问题,因为我已经从一个位于西班牙的VPS换到了位于爱尔兰的亚马逊EC2,问题仍然存在。

我觉得也不是客户端网络的问题,因为这样的情况每天都有几十次,平均在线的用户量大概是45-55个,一天大概有400个唯一的用户,所以这个比例是极高的。

编辑:我做了更多的研究。我已经把服务器改成了C++。

我要把这个加进去,作为一个答案,这样人们就会对此有一些了解。

共有1个答案

孙风畔
2023-03-14

我认为答案是内核是关闭连接的那个。以下是一些信息:http://scie.nti.st/2008/3/14/Amazon-S3-and-connection-reset-by-peer

基本上,按照我的理解,Linux内核2.6.17+增加了TCP窗口/缓冲区的最大大小,如果它不能处理足够大的TCP窗口,这就会导致其他设备出现故障。齿轮将重置连接,我们将其视为“对等点重置连接”消息。

我已经按照步骤进行了操作,现在看来只有当客户端失去与Internet的连接时,服务器才会关闭连接。

 类似资料:
  • 我使用Android应用程序通过TCP套接字与同一局域网上的PC java应用程序进行通信、发送和接收消息。下面是我在android中使用的Asynctask的代码,用于发送消息并从PC接收回复: } 我在onPostExcecute中的祝酒词中显示PC的回复。 Android通过BufferedWriter发送消息,而PC上的java应用程序在BufferedReader中接收消息。 PC在收到

  • 因此,我正在用Java编写一个程序,在DatagramSocket和DataGramPacket的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如:

  • 当我尝试接收大量数据时,它会被切断,我必须按enter键才能获取其余数据。起初,我可以增加一点,但它仍然不会收到所有的。正如您所看到的,我增加了conn.recv()上的缓冲区,但它仍然无法获取所有数据。它会在某一点切断它。我必须在原始输入上按enter键才能接收其余数据。我是否可以一次获取所有数据?这是密码。

  • 所有这些似乎都运行良好,但cliend在身份验证后发送的数据似乎没有收到,只有3个字节设置为0。 我希望套接字在程序的生存期内保持打开状态,因此我不能处理流,因为这样也会处理套接字。 这里是客户端和服务器端的完整代码,希望有人能看到我的错误,或者我错过了一个问题。

  • 我在JAVA中通过TCP接收字节数据包时遇到了一些问题。我的TCPServer类发送207字节的数据包。当我发送一个数据包时,控制台中的程序显示“读取207字节的数据包”然后停下来。在下一个数据包继续执行时,显示“多重测量”和“读取1868767867字节数据包”。之后,接收将永远停止。我不知道它为什么接收1868767867字节。我在wireshark中检查它,服务器总是发送207字节。 这是我