void listen_pipe(char *name, void (*onconnect)(HANDLE client,void *params), void *args) { LPWSTR _name = tomb(name); WINE_TRACE("begin '%s'->'%s'\n", name, (char*)_name); HANDLE p; for (;;) { // hangs here p = CreateNamedPipeW( _name, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT, 1, 1024, 1024, 0, NULL); WINE_TRACE("pipe \"%s\" created\n",name); if (p==INVALID_HANDLE_VALUE) { WINE_TRACE("could not create pipe \"%s\", error: %s\n",name,last_error()); break; } WINE_TRACE("pipe \"%s\" created, listen\n",name); if (ConnectNamedPipe(p,NULL)) { WINE_TRACE("client connected...\n"); onconnect(p,args); continue; } else { CloseHandle(p); } } WINE_TRACE("exit...\n"); }
//-------------------------------------------------------------- void Protocol::_onconnect(Event& args){ onconnect(args); }
void c_winsock::Execute() { int iret; struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 1000; while(!m_bTheadExit) { fd_set fdsetRead; fdsetRead = m_fdset; fd_set fdsetwrite; fdsetwrite = m_fdset; fd_set fdsetexceptds; fdsetexceptds = m_fdset; //iret 参数非法 或 winsock初始化非法 //except 非阻塞模式connect失败;OOB data is available for reading (only if SO_OOBINLINE is disabled). iret = select( 0, &fdsetRead, &fdsetwrite, &fdsetexceptds, &timeout ); switch( iret ) { //错误 case SOCKET_ERROR: { if (m_pDispatch) { m_pDispatch->on_error(this, WSAGetLastError()); _disconnect(); } } break; //超时 case 0: { } break; //default default: { if(FD_ISSET(m_sock, &fdsetwrite)) //发现可写 { if (!m_bconnect) { SetEvent(m_henvet); if (onconnect() == 0) { if (m_pDispatch) { m_pDispatch->on_connect(this); } } else { if (m_pDispatch) { m_pDispatch->on_fail(this, WSAGetLastError()); } _disconnect(); } continue; } onwrite(); } if (FD_ISSET(m_sock, &fdsetRead )) { unsigned long ulReadLen = 0; ioctlsocket(m_sock, FIONREAD, &ulReadLen); if ( ulReadLen > 0 ) { onread(ulReadLen); } else //缓存区没有数据, 判断是否断开 { if (m_bconnect) { if (ulReadLen == 0) //正常断开 { if (m_pDispatch) { m_pDispatch->on_disconnect(this, 0); } _disconnect(); continue; } else if (ulReadLen == -1 && WSAGetLastError() == EINTR) //socket正常状态 { //..... } else //异常断开 { if (m_pDispatch) { m_pDispatch->on_fail(this, ulReadLen); } _disconnect(); continue; } } else { } } } if (FD_ISSET(m_sock, &fdsetexceptds)) { if (m_bconnect) { if (m_pDispatch) { m_pDispatch->on_error(this, WSAGetLastError()); } _disconnect(); } else { SetEvent(m_henvet); if (m_pDispatch) { m_pDispatch->on_fail(this, WSAGetLastError()); } return ; } } }//end default }//end switch if (GetTickCount() - m_dwtick >= m_msectime) { if (m_pDispatch) { m_pDispatch->on_timer(this); } m_dwtick = GetTickCount(); } _sleep(10); } if (m_pDispatch) { m_pDispatch->on_release(this); } }