maomao85 2015年01月04日
socket编程,recv返回值为0的疑问
我现在用socket提交一个post请求到server.我设置了接收超时,我想用这个接收超时来判断是不是收完了数据.
可是我实际调试的时候发现recv这个函数并没有返回-1,而是返回0.我在网上百度,看到说recv返回0表示服务器关闭连接.
可是为什么关闭连接了还不触发接收超时呢?或者说关闭连接了为什么recv不返回-1?
代码如下:
post请求函数

void CSocketHttpDlg::OnPost()
{
memset(m_requestHeader,0,1024);

sockHttp = socket(AF_INET,SOCK_STREAM,0);
if (sockHttp == INVALID_SOCKET)
{
MessageBox(_T("Error at socket()"),_T("Attention"),MB_OK);
WSACleanup();
return;
}

sockaddr_in addrServer;
addrServer.sin_family = AF_INET;
addrServer.sin_addr.s_addr = inet_addr(VK2100IP);
addrServer.sin_port = htons(80);

int recvTimeout = 2*1000;
if(setsockopt(sockHttp,SOL_SOCKET,SO_RCVTIMEO,(char*)&recvTimeout,sizeof(int)) == SOCKET_ERROR)
{
MessageBox(_T("Error at setsockopt(SO_RCVTIMEO)"),_T("Attention"),MB_OK);
closesocket(sockHttp);
WSACleanup();
return;
}

if ( connect( sockHttp,(SOCKADDR*) &addrServer, sizeof(sockaddr_in) ) == SOCKET_ERROR )
{
MessageBox(_T("Error at connect()"),_T("Attention"),MB_OK);
closesocket(sockHttp);
WSACleanup();
return;
}

char url[255] = "/cgi/getinfo.cgi";
char postData[255] = "PanelInfo=FFFFFFFF";
SetPostRequestHeader(url,VK2100IP,postData);
if ( send( sockHttp,m_requestHeader, strlen(m_requestHeader),0 ) == SOCKET_ERROR )
{
MessageBox(_T("Error at send()"),_T("Attention"),MB_OK);
closesocket(sockHttp);
WSACleanup();
return;
}

Para para=new PARA;
para->pSock=&sockHttp;
AfxBeginThread((AFX_THREADPROC)RecvData,LPVOID(para),0,0,0,NULL);
}


接收线程函数

UINT CSocketHttpDlg::RecvData(LPVOID lpParameter)
{
Para para=(Para)lpParameter;
SOCKET *pSockLocal = para->pSock;
char recvBuf[1024];
bool isTimeout = false;
char msg[1024];
memset(msg,0,1024);
int size_recv;
while(!isTimeout)
{
memset(recvBuf,0,1024);
if((size_recv = recv(*pSockLocal,recvBuf,1024,0) ) == SOCKET_ERROR)
{
if (WSAGetLastError() == WSAETIMEDOUT)//发现一直不会走到这一步
{
isTimeout = true;
OutputDebugStringA("timeover");
}
}
else if (size_recv == 0)//网上百度后发现会走到这一步
{
OutputDebugStringA("receive 0");
isTimeout = true;
}
else
{
strcat_s(msg,strlen(recvBuf)+strlen(msg)+1,recvBuf);
}
}

closesocket(*pSockLocal);
WSACleanup();
delete para;
return 0;
}
...全文
779 点赞 收藏 11
写回复
11 条回复

还没有回复,快来抢沙发~

发动态
发帖子
网络编程
创建于2007-09-28

7878

社区成员

6.4w+

社区内容

VC/MFC 网络编程
社区公告
暂无公告