有人知道如何在服务器端判断一个服务器端的TCP连接套接字被客户端关闭了吗? 用什么函数来判断?好象用 DealSocket == INVALID_SOCKET 不行,套接字API中有函数可以判断吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我记得好像会发一个FD_CLOSE消息吧? int WSAEventSelect( SOCKET s, WSAEVENT hEventObject, long lNetworkEvents ); 我记得好像会发一个FD_CLOSE消息吧?+int WSAEventSelect( SOCKET s, WSAEVENT hEventObject, long lNetworkEvents );将事件怎加, FD_CLOSE | FD_READ 在服务端,处理FD_CLOSE消息,消息参数中wParam即是关闭的客户端SOCKET套接字 在TCP方式,用WSAEventSelect 来处理消息,要注意FD_CLOSE可能在没有接收结束就会接到给你贴个例子:UINT CReadSocket::ReaderProc( LPVOID pArgv ){ DWORD dwResult = 0; bool fDone = false; HANDLE hArray[2] = { NULL,NULL }; WSANETWORKEVENTS nwEvents; int nErr = 0; BOOL bClosed = FALSE; CReadSocket * pOwner = (CReadSocket*)pArgv; if( pOwner == NULL ) return 0; Startup(); // memset( &nwEvents, 0, sizeof( WSANETWORKEVENTS)); hArray[0] = pOwner->m_hQuit; hArray[1] = pOwner->m_hSocketEvent; // for( ; !fDone ; ) { dwResult = WSAWaitForMultipleEvents( 2, hArray, FALSE, 500, FALSE ); switch( dwResult ) { case WSA_WAIT_EVENT_0:// close event fDone = !fDone; break; case WSA_WAIT_EVENT_0+1: { nErr = WSAEnumNetworkEvents( pOwner->m_socket, hArray[1], &nwEvents ); if( nErr != 0 ) break; // if( nwEvents.lNetworkEvents & FD_READ ){ pOwner->OnRead( nwEvents.iErrorCode[FD_READ_BIT] ); } if( nwEvents.lNetworkEvents & FD_CLOSE ) { bClosed = TRUE; } if( nwEvents.lNetworkEvents & FD_ADDRESS_LIST_CHANGE ) { } if( nwEvents.lNetworkEvents & FD_ROUTING_INTERFACE_CHANGE ) { } } break; case WSA_WAIT_TIMEOUT: if( bClosed ){ nErr = pOwner->OnRead( 0 ); if( nErr == 0 || nErr == SOCKET_ERROR ){ fDone = true; pOwner->OnClose( 0 ); } } break; default: fDone = true; break; } } pOwner->OnClose( nwEvents.iErrorCode[ FD_CLOSE_BIT] ); Cleanup(); TRACE( "CReadSocket Thread Exit.\n"); return 1;} 怎么把串口接收来的数据付给一个数组,SerialPort类 打印预览和打印效果不一样 AcceptEx投递后为什么客户端connect后没有事件响应? COM 事件问题,吐血啊 关于extern的疑惑 求三维圆弧端点 关于COM的基础性问题! 托盘问题! 不知道有人会吗?? 多线程问题 (求救)在VC中通过ADO 访问Oracle数据库存在的问题: 请问如何发送ARP请求并接受ARP响应?解决者高分赠送!!!
SOCKET s,
WSAEVENT hEventObject,
long lNetworkEvents
);
+
int WSAEventSelect(
SOCKET s,
WSAEVENT hEventObject,
long lNetworkEvents
);将事件怎加, FD_CLOSE | FD_READ
给你贴个例子:
UINT CReadSocket::ReaderProc( LPVOID pArgv )
{
DWORD dwResult = 0;
bool fDone = false;
HANDLE hArray[2] = { NULL,NULL };
WSANETWORKEVENTS nwEvents;
int nErr = 0;
BOOL bClosed = FALSE; CReadSocket * pOwner = (CReadSocket*)pArgv;
if( pOwner == NULL )
return 0; Startup();
//
memset( &nwEvents, 0, sizeof( WSANETWORKEVENTS)); hArray[0] = pOwner->m_hQuit;
hArray[1] = pOwner->m_hSocketEvent;
//
for( ; !fDone ; )
{
dwResult = WSAWaitForMultipleEvents( 2, hArray, FALSE, 500, FALSE );
switch( dwResult )
{
case WSA_WAIT_EVENT_0:// close event
fDone = !fDone;
break;
case WSA_WAIT_EVENT_0+1:
{
nErr = WSAEnumNetworkEvents( pOwner->m_socket, hArray[1], &nwEvents );
if( nErr != 0 )
break;
//
if( nwEvents.lNetworkEvents & FD_READ ){
pOwner->OnRead( nwEvents.iErrorCode[FD_READ_BIT] );
} if( nwEvents.lNetworkEvents & FD_CLOSE )
{
bClosed = TRUE;
}
if( nwEvents.lNetworkEvents & FD_ADDRESS_LIST_CHANGE )
{
}
if( nwEvents.lNetworkEvents & FD_ROUTING_INTERFACE_CHANGE )
{
}
}
break;
case WSA_WAIT_TIMEOUT:
if( bClosed ){
nErr = pOwner->OnRead( 0 );
if( nErr == 0 || nErr == SOCKET_ERROR ){
fDone = true;
pOwner->OnClose( 0 );
}
} break;
default:
fDone = true;
break;
}
}
pOwner->OnClose( nwEvents.iErrorCode[ FD_CLOSE_BIT] );
Cleanup();
TRACE( "CReadSocket Thread Exit.\n");
return 1;
}