Beispiel #1
0
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);
	}
}