【问题标题】:socket error 10054套接字错误 10054
【发布时间】:2011-12-19 08:28:53
【问题描述】:

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

服务器在 CentOS 5.4 上运行,客户端是运行在 virtual box 中的 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

我不太明白socket缓冲区配置是什么意思,如果这样会导致接收不完整的结果问题?

【问题讨论】:

  • “连接被对端重置”最可能的原因是对方程序崩溃了。
  • @David Schwartz,服务器接缝正常,socket 没有关闭,最后,recv 超时错误。
  • 接收超时? TCP 通常没有接收超时。那是你自己的代码吗?当您认为接收超时时,您会怎么做?您是否 100% 确定客户端在服务器接收超时之前 已通过对等方重置连接? (如果反过来,那就是代码中的错误。双方都在等待对方。)

标签: sockets windows-7 centos virtualbox


【解决方案1】:

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

例如:

1) 客户端发送消息。

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

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

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

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

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

如果您告诉我更多关于您的协议的信息,我可能会更详细地告诉您出了什么问题。什么构成消息?哪方什么时候发?有什么认可吗?以此类推。

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

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

【讨论】:

  • 我使用 socksetopt 来设置接收超时。如果不设置超时,程序服务器将永远等待recv,recv不会返回..
  • 啊,那么您可能正在致电recv 等待您实际上已经收到的消息。要么,要么你的时间不够长。或者您的协议没有正确实施,而当对方没有理由发送消息时,您正在等待消息。但我敢打赌,接收超时,然后连接重置。所以问题是超时,重置是一个症状。
  • 这个问题可能和我代码中的接收缓冲区处理有关,我去查一下。
  • 你说得对,这种现象是服务器断开连接造成的,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
相关资源
最近更新 更多