【发布时间】:2011-07-22 12:00:46
【问题描述】:
我正在编写一个在我的 C++Builder 项目中使用的网络 DLL。此 DLL 可用于远程 FTP 服务器。当recv() 被调用时,我注意到一个奇怪的行为。有时它返回 0。但在另一个线程中,当在同一个套接字上调用 recv() 时,会按预期接收数据。
这是什么意思?我还注意到在 DLL 线程内调用 Application->ProcessMessage() 可以加快数据接收速度。
但是有什么问题吗? ProcessMessages() 不只是处理窗口消息还是我遗漏了什么?
谢谢
【问题讨论】:
-
recv函数的返回值是多少?如果是SOCKET_ERROR,请致电WSAGetLastError()并报告。 -
@SS 它返回 0,而在另一个线程中它返回接收到的数据。插座是 100% 相同的
-
套接字处于非阻塞模式。我也尝试打开和关闭 nodelay - 同样的情况。
-
@Sergey:如果
recv()返回0,表示连接被对方关闭。如果recv()返回SOCKET_ERROR,则WSAGetLastError()不应返回0,除非您在recv()退出后但在调用WSAGetLastError()之前重置调用线程的错误状态。 -
@Remy 不表示当系统收到 PSH 数据包且没有更多数据包时 recv()=0?
标签: c++ networking network-programming winsock c++builder