sockets - 套接字错误 10054

标签 sockets windows-7 centos virtualbox

我有一个 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/

相关文章:

c - 为什么打开的文件描述符没有被重用,而是数值不断增加

javascript - WebSocket ws如何模拟错误事件?

java - TCP服务器未运行时,如何克服TCP客户端挂起?

visual-studio - 是否有支持可移植类库并在 Windows 7 上运行的 VS 免费版本?

windows - Tomcat 7 作为 Windows 服务无法从其他系统访问

scala - sbt package command : [error] Error parsing expression. 确保设置用空行分隔

java - 我的 Centos 6.4 上同时存在两个 Java 版本(1.8.0_66 和 1.7.0_67),如何删除旧的 1.7?

c++ - 如何接收来自已订阅组的组播数据包?

bash - Windows 桌面上的 cygwin ssh 快捷方式

cmake - yum 删除 cmake 失败