我有一个 C/S 程序。客户端使用套接字向服务器发送文件,在发送大约超过 700k 数据后,客户端(在 win7 上)将收到套接字 10054 错误,这意味着连接被对等方重置。
服务器在CentOS 5.4上运行,客户端是在virtual box中运行的windows7虚拟机。客户端和服务器通过虚拟网络接口(interface)进行通信。 命令端口(发送日志)正常,但数据端口(发送文件)有问题。 是不是socket buffer size配置错误或者其他原因造成的? 如果有人可以帮我检查问题。谢谢。
每次我调用套接字发送一个缓冲区等于 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
不太明白socket buffer配置是什么意思,这样会不会导致receive incomplete result的问题?
最佳答案
这几乎肯定是您代码中的错误。最有可能的是,一方认为另一方已经超时,因此异常关闭连接。发生这种情况的最常见方式是您调用接收函数来获取数据,但实际上您已经获取了该数据,只是没有意识到而已。因此,您正在等待已经收到的数据,因此超时。
例如:
1) 客户端发送消息。
2) 客户端发送另一条消息。
3) 服务器读取了两条消息,但认为它只收到一条消息,发送确认。
4) 客户端收到确认,等待服务器永远不会发送的第二个确认。
5) 服务器等待它实际上已经收到的第二条消息。
现在服务器在等待客户端,客户端也在等待服务器。服务器编码错误,没有意识到它实际上一口气收到了两条消息。 TCP 不保留消息边界。
如果你告诉我更多关于你的协议(protocol)的信息,我可能会更详细地告诉你哪里出了问题。什么构成消息?哪一方什么时候发送?有没有致谢?等等。
但简而言之,双方可能都在等待对方。
最有可能的是,对等方重置的连接是一种症状。出现您的问题,一侧超时并中止连接。这会导致另一方重置连接,因为另一方中止了连接。
关于sockets - 套接字错误 10054,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8558738/