Sockets 套接字错误10054

Sockets 套接字错误10054,sockets,windows-7,centos,virtualbox,Sockets,Windows 7,Centos,Virtualbox,我有一个C/S程序。客户端使用套接字向服务器发送文件,在发送大约超过700k的数据后,客户端(在win7上)将收到套接字10054错误,这意味着对等方重置了连接 服务器在CentOS 5.4上工作,客户端是windows7虚拟机,在虚拟机中运行。客户机和服务器通过虚拟网络接口进行通信。 命令端口(发送日志)正常,但数据端口(发送文件)有问题。 是否是由于套接字缓冲区大小配置错误或其他原因造成的? 如果有人能帮我检查一下这个问题。谢谢 每次我调用套接字发送一个等于4096字节的缓冲区 发送(套接字

我有一个C/S程序。客户端使用套接字向服务器发送文件,在发送大约超过700k的数据后,客户端(在win7上)将收到套接字10054错误,这意味着对等方重置了连接

服务器在CentOS 5.4上工作,客户端是windows7虚拟机,在虚拟机中运行。客户机和服务器通过虚拟网络接口进行通信。 命令端口(发送日志)正常,但数据端口(发送文件)有问题。 是否是由于套接字缓冲区大小配置错误或其他原因造成的? 如果有人能帮我检查一下这个问题。谢谢

每次我调用套接字发送一个等于4096字节的缓冲区 发送(套接字、缓冲区、4096、0)

CentOS套接字配置

#sysctl -a
...
net.ipv4.tcp_rmem = 4096        87380   4194304
net.ipv4.tcp_wmem = 4096        16384   4194304
net.ipv4.tcp_mem = 196608       262144  393216
net.ipv4.tcp_dsack = 1
net.ipv4.tcp_ecn = 0
net.ipv4.tcp_reordering = 3
net.ipv4.tcp_fack = 1

我不太明白套接字缓冲区配置意味着什么,如果这会导致接收不完整结果的问题?

这几乎肯定是代码中的一个错误。最可能的情况是,一方认为另一方超时,因此异常关闭连接。最常见的方法是调用接收函数来获取数据,但实际上已经获取了数据,只是没有意识到而已。因此,您正在等待已经收到的数据,因此超时

例如:

1) 客户端发送一条消息

2) 客户端发送另一条消息

3) 服务器读取了两条消息,但认为只收到了一条,于是发送了一条确认消息

4) 客户端接收确认,等待服务器永远不会发送的第二个确认

5) 服务器等待实际已收到的第二条消息

现在,服务器正在等待客户端,客户端正在等待服务器。服务器编码不正确,没有意识到它实际上一次收到了两条消息。TCP不保留消息边界

如果你告诉我更多关于你的协议,我可能会告诉你更详细的错误。什么构成信息?哪一方何时发送?有任何确认吗?等等

但简短的说法是,双方可能都在等待对方


最可能的情况是,对等方重置连接是一种症状。出现问题时,一侧超时并中止连接。这会导致另一方获得连接重置,因为另一方中止了连接。

最有可能导致“对等方连接重置”的原因是另一方的程序崩溃。@David Schwartz,服务器连接正常且套接字未关闭,最后收到recv超时错误。接收超时?TCP通常没有接收超时。那是你自己的密码吗?当您认为接收超时时,您会怎么做?您是否100%确定客户端在服务器接收超时之前已由对等方重置连接?(如果是相反的,那就是代码中的一个bug。每一方都在等待另一方。)我使用socksetopt设置recv timeout。如果未设置超时,程序服务器将永远等待recv,并且recv不会返回..啊,那么您可能正在调用
recv
以等待您实际收到的消息。要么就是你的休息时间不够长。或者您的协议没有正确实现,您正在等待消息,而对方没有理由发送消息。但我打赌接收超时,然后连接重置。所以问题是超时,重置是一个症状。可能这个问题与我的代码中的接收缓冲区处理有关,我会检查它。你是对的,这个现象是由服务器终止连接引起的,谢谢!