套接字错误10054

时间:2011-12-19 08:28:54

标签: sockets windows-7 centos virtualbox

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

服务器在CentOS 5.4上运行,客户端是在虚拟机中运行的windows7虚拟机。客户端和服务器通过虚拟网络接口进行通信。 命令端口(发送日志)是正常的,但数据端口(发送文件)有问题。 如果是由套接字缓冲区大小配置错误引起的? 如果有人可以帮我检查问题。感谢。

每次调用socket时,发送缓冲区等于4096字节 send(socket,buffer,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 个答案:

答案 0 :(得分:5)

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

例如:

1)客户端发送消息。

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

3)服务器读取这两条消息,但认为只有一条消息,发送确认。

4)客户端收到确认,等待第二次确认哪个服务器永远不会发送。

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

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

如果您告诉我有关您的协议的更多信息,我可以更详细地告诉您出了什么问题。什么构成了信息?哪一方发送的时间?有没有确认?等等。

但简短的版本是每一方都可能在等待另一方。

最有可能的是,通过对等方重置连接是一种症状。您的问题发生,一方面超时并中止连接。这导致另一方重置连接,因为另一方中止了连接。