TCP C/S方式中,如果一端closesocket(h)了,另一方如何检测到对应的套接字句柄已关闭了(非阻塞方式)?是不是 recv()返回<0, 同时GetLastError()=0?
解决方案 »
- 关于类成员变量 导出如何处理
- 谁发个资源给我啊ShowPictLib(DllPathTrans)界面类
- 串口ReadFile出现问题,用GetLastError()时,老是得出 The Parameter is incorrectly!详细如下
- 创建Socket连接的问题?
- “菜根”问题:怎么在对话框里导入位图资源
- 有关控制台中代码页的一个问题!!!!
- 急,绘制曲线问题......
- 错误LNK2001:,可能是lib的版本冲突.请问各位如何解决.....急!!!!
- 救命啦!我的子菜单能看不能用。
- 请教高手:在VC的IDE中,当键入一个类时,如CString string_temp.Format....,小数点后会自动出现提示,有些可以找到文档说明,有些没有,那里有比较全的说明?多谢。
- ★★★★★★★★★★ 两星 ,散分 ^_^ ★★★★★★★★★★
- 【讨论系统托盘管理】
WSAGetLastError返回的不是0
If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero.这里的关闭是本地关闭还是对方关闭?我用的是非阻塞方式的,即每次有没有数据可以接收需要我自己查询一下(select),
/*****************************************************/
int Receive(SOCKET hTcpSocket, CHAR *buffer, int length, int nTimeOut)
{
int iRecvStatus=0;
nRecvBytes = 0 ;
while ( nRecvBytes < length )
{
if ( Test(hTcpSocket, READ, nTimeOut ) == FALSE )
{
TRACE("TcpSocket %d now is not ready for recving, %d bytes recved , error code %d\n", hTcpSocket, nRecvBytes, nSocketError);
return sWAITING;
}
if ( (iRecvStatus = recv(hTcpSocket, buffer + nRecvBytes, length - nRecvBytes, 0 )) <= 0 )
{
nSocketError = WSAGetLastError();
TRACE("TcpSocket %d recv failed, error code %d, %d bytes recved\n", hTcpSocket, nSocketError, nRecvBytes);
return sERROR;
}
nRecvBytes += iRecvStatus ;
}
return nRecvBytes ;
}
/*****************************************************/
BOOL Test(SOCKET hSocket, EVENT e, int iTimeOut)
{
int nReadSocket = 0 ;
fd_set sockSet;
struct timeval interval; FD_ZERO(&sockSet);
FD_SET(hSocket, &sockSet);
interval.tv_sec = iTimeOut;
interval.tv_usec = (iTimeOut > 0) ? 0 : 10;
if ( e == READ )
return ( nReadSocket = select(0, &sockSet, NULL, NULL, &interval));
else if ( e == WRITE )
return ( nReadSocket = select(0, NULL, &sockSet, NULL, &interval) );
return (nReadSocket == 1);
}
现在我发现,如果对方关闭了连接,则本地的 test返回一直为false,因为
select(0, &sockSet, NULL, NULL, &interval) 返回不为1,就是说没有 套接字里有数据 可以被接收了.所以test下面的 recv也不会执行了, 那我怎么判断呢?
用WSAAsyncSelect()函数,让套接字关闭的时候给某个窗口发送某个消息。或者:
用 WSAEventSelect(),让套接字关闭时使某个事件处于有信号状态。
hSocket=INVALID_SOCKET;//
然后每次都判断一下hSocket就行了
recv返回-1,如果 GetLastError() != 10035 的话...
用VC的errorlookup看一下错误代码吧!基本上可以关掉了如果不想用recv就用select,最好先select,套接字有事情发生(数据到来/套接字关闭)会返回的,然后recv
to test the connection. Throught the return value and the GetLastError() would be suffice if you only wanna get the connection status.