recv 收到数据,但是返回0,请教是什么有关问题?多谢

recv 收到数据,但是返回0,请问是什么问题?谢谢

int ExampleClass::SetConf( const char *cmd, char *resultBuf, size_t resultBufSize, int waitMillsecond )
 {
int ret  = 0;
WSADATA wsaData; 
do 
{
if (WSAStartup(MAKEWORD(2,1),&wsaData))

ret = -1;
break;

m_MgmntSock = socket(AF_INET,SOCK_STREAM,0); 
if (m_MgmntSock == NULL)
{
ret = -1;
break;
}
SOCKADDR_IN addr;
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addr.sin_family = AF_INET;
addr.sin_port = htons(conf_ManagementPort);
int ret = 0;
ret = connect(m_MgmntSock, (SOCKADDR *)&addr, sizeof (SOCKADDR));
if (0 != ret)
{
return -1;
break;
}
ret = send(m_MgmntSock, cmd, strlen(cmd), 0);

fd_set fds;
FD_ZERO(&fds);
FD_SET(m_MgmntSock, &fds);
struct timeval timeout = {waitMillsecond / 1000, waitMillsecond % 1000 * 1000};

switch (select(m_MgmntSock+1, &fds, NULL, NULL, &timeout))
{
case -1:
ret = -1;
break;
case 0:
ret = 0;
break;
default:
ret = -1;
memset(resultBuf, 0, resultBufSize);
ret = recv(m_MgmntSock, resultBuf, resultBufSize, 0);
                                // 上面这句后,resultBuf中有了接收到得数据"ok",
                                // 理论上是"ok\r\n"的,可能是VS2010调试时没显示出\r\n而已。
                                // 但是返回值ret 被设为了0。请问什么原因?谢谢
break;
}
}while(false);

if (ret < 0)
{
fprintf(stderr, "[*** Error **] Code: %d, File: %s: %d\r\n", GetLastError(), __FILE__, __LINE__);
}

if (m_MgmntSock != NULL)
{
closesocket(m_MgmntSock);
m_MgmntSock = NULL;
}
WSACleanup();
return ret;
}
recv 返回0 收到数据

------解决方案--------------------
switch (select(m_MgmntSock+1, &fds, NULL, NULL, &timeout))

你这里的select不是返回0?你send完马上select基本都是返回0的吧  除非你远端接收的socket一直在发...
------解决方案--------------------
好像没理解LZ的意思

是你断点到
ret = recv(m_MgmntSock, resultBuf, resultBufSize, 0);
下一步,resultBuf有收到字符?但是ret=0?  (开什么玩笑?)

还是select超时 ret = 0?
------解决方案--------------------
你的意思是recv函数调用,缓冲区得到了数据?但是recv的返回值为0 ???recv 收到数据,但是返回0,请教是什么有关问题?多谢
------解决方案--------------------
Return value
If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero.
Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.

Error code
WSANOTINITIALISED
A successful WSAStartup call must occur before using this function.
WSAENETDOWN
The network subsystem has failed.
WSAEFAULT
The buf parameter is not completely contained in a valid part of the user address space.
WSAENOTCONN
The socket is not connected.
WSAEINTR
The (blocking) call was canceled through WSACancelBlockingCall.
WSAEINPROGRESS
A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.
WSAENETRESET
For a connection-oriented socket, this error indicates that the connection has been broken due to keep-alive activity that detected a failure while the operation was in progress. For a datagram socket, this error indicates that the time to live has expired.