Esempio n. 1
0
BOOL LLAsyncHostByName::startRequest( const LLString& domain_name, LLAsyncHostByNameCallback callback, void* userdata )
{
	if( isPendingRequest() )
	{
		llwarns << "LLAsyncHostByName::startRequest() cancelled existing request." << llendl;
		cancelPendingRequest();
	}

	mCallback = callback;
	mUserdata = userdata;
	memset(mOutputBuffer, 0, sizeof( mOutputBuffer ) );
	mDomainName = domain_name;

	mRequestHandle = WSAAsyncGetHostByName( 
		(HWND)gViewerWindow->getPlatformWindow(),
		LL_WM_HOST_RESOLVED,
		domain_name.c_str(),
		mOutputBuffer,
		sizeof( mOutputBuffer ) );

	if( !mRequestHandle )
	{
		llwarns << "LLAsyncHostByName::startRequest() failed: " << WSAGetLastError() << llendl;
		return FALSE;
	}

	return TRUE;
}
Esempio n. 2
0
	HANDLE AsyncGetHostByName(const char* pHostName, void* pContext, GETHOSTBYNAME_CALLBACK pCallBack)
	{
		WNDCLASSEX wndclass;
		wndclass.cbSize		   = sizeof wndclass;
		wndclass.style		   = 0;
		wndclass.lpfnWndProc   = WindowProc;
		wndclass.cbClsExtra	   = 0;
		wndclass.cbWndExtra    = 0;
		wndclass.hInstance     = GetModuleHandle(0);
		wndclass.hIcon		   = 0;
		wndclass.hCursor	   = 0;
		wndclass.hbrBackground = 0;
		wndclass.lpszMenuName  = 0;
		wchar_t sz[100]={0};
		wsprintf(sz, L"%s_%d", GETHOSTBYNAME_WND_CLASSNAME, (int)pContext);
		wndclass.lpszClassName = sz;
		wndclass.hIconSm       = 0;

		if(RegisterClassEx(&wndclass))
		{
			AsyncGetHostByNameData* pData = new AsyncGetHostByNameData;
			memset(&pData->cHostent, 0, sizeof(pData->cHostent));
			pData->pCallBack = pCallBack;
			pData->pContext = pContext;
			HWND hWnd = CreateWindow(sz, sz, 0, 0, 0, 0, 0, 0, 0, 0, GetModuleHandle(0));
			SetWindowLong(hWnd, GWL_USERDATA, (LONG)pData);

			return WSAAsyncGetHostByName(hWnd, GETHOSTBYNAME_MSG, pHostName, pData->cHostent, MAXGETHOSTSTRUCT);
		}

		return 0;
	}
Esempio n. 3
0
int WAsyncSocket::Connect(char *host,unsigned int port)
{
	m_port=port;

	// Check to see if we need to get the ip address from the host address
	bool is_ip_string=false;
	unsigned int ip_int[4];
	if(sscanf(host,"%u.%u.%u.%u",&ip_int[0],&ip_int[1],&ip_int[2],&ip_int[3])==4)
	{
		is_ip_string=true;
	}
	
	// If this is not an ip string we are connecting to, then resolve the hosts ip address from the DNS
	if(is_ip_string==false)
	{
		WSAAsyncGetHostByName(m_hwnd,WM_GOT_HOST_BY_NAME_MESSAGE,host,m_hostent_buf,sizeof(m_hostent_buf));
	}
	else	// it is just an IP
	{
		unsigned long ip_addr=inet_addr(host);
		WSAAsyncGetHostByAddr(m_hwnd,WM_GOT_HOST_BY_ADDRESS_MESSAGE,(char *)&ip_addr,sizeof(unsigned long),AF_INET,
			m_hostent_buf,sizeof(m_hostent_buf));
	}

	return 0;
}
Esempio n. 4
0
BOOL CNetwork::AsyncResolve(LPCTSTR pszAddress, WORD nPort, PROTOCOLID nProtocol, BYTE nCommand)
{
	CSingleLock pLock( &m_pSection );
	if ( ! pLock.Lock( 250 ) ) return FALSE;
	
	BYTE* pResolve = (BYTE*)malloc( MAXGETHOSTSTRUCT + 8 );
	
	USES_CONVERSION;
	
	HANDLE hAsync = WSAAsyncGetHostByName( AfxGetMainWnd()->GetSafeHwnd(), WM_WINSOCK,
		T2CA(pszAddress), (LPSTR)pResolve + 8, MAXGETHOSTSTRUCT );
	
	if ( hAsync != NULL )
	{
		*((CString**)&pResolve[0])	= new CString( pszAddress );
		*((WORD*)&pResolve[4])		= nPort;
		*((BYTE*)&pResolve[6])		= nProtocol;
		*((BYTE*)&pResolve[7])		= nCommand;
		
		m_pLookups.SetAt( (LPVOID)hAsync, (LPVOID)pResolve );
		return TRUE;
	}
	else
	{
		free( pResolve );
		return FALSE;
	}
}
Esempio n. 5
0
*/	DEVICE_CMD Read_DNS(REBREQ *sock)
/*
**		Initiate the GetHost request and return immediately.
**		Note the temporary results buffer (must be freed later).
**
***********************************************************************/
{
	void *host;
#ifdef HAS_ASYNC_DNS
	HANDLE handle;
#else
	HOSTENT *he;
#endif

	host = OS_Make(MAXGETHOSTSTRUCT); // be sure to free it

#ifdef HAS_ASYNC_DNS
	if (!GET_FLAG(sock->modes, RST_REVERSE)) // hostname lookup
		handle = WSAAsyncGetHostByName(Event_Handle, WM_DNS, sock->data, host, MAXGETHOSTSTRUCT);
	else
		handle = WSAAsyncGetHostByAddr(Event_Handle, WM_DNS, (char*)&(sock->net.remote_ip), 4, AF_INET, host, MAXGETHOSTSTRUCT);

	if (handle != 0) {
		sock->net.host_info = host;
		sock->handle = handle;
		return DR_PEND; // keep it on pending list
	}
#else
	// Use old-style blocking DNS (mainly for testing purposes):
	if (GET_FLAG(sock->modes, RST_REVERSE)) {
		he = gethostbyaddr((char*)&sock->net.remote_ip, 4, AF_INET);
		if (he) {
			sock->net.host_info = host; //???
			sock->data = he->h_name;
			SET_FLAG(sock->flags, RRF_DONE);
			return DR_DONE;
		}
	}
	else {
		he = gethostbyname(sock->data);
		if (he) {
			sock->net.host_info = host; // ?? who deallocs?
			COPY_MEM((char*)&(sock->net.remote_ip), (char *)(*he->h_addr_list), 4); //he->h_length);
			SET_FLAG(sock->flags, RRF_DONE);
			return DR_DONE;
		}
	}
#endif

	OS_Free(host);
	sock->net.host_info = 0;

	sock->error = GET_ERROR;
	//Signal_Device(sock, EVT_ERROR);
	return DR_ERROR; // Remove it from pending list
}
Esempio n. 6
0
void
gethost_byname(const char *name, struct DNSQuery *query)
{
  query->handle = WSAAsyncGetHostByName(wndhandle, WM_DNS, name, query->reply,
    sizeof(query->reply));

  if (!query->handle)
    query->callback(query->ptr, NULL);
  else
    dlinkAdd(query, &query->node, &dns_queries);
}
Esempio n. 7
0
int CSock::Connect(const char *address, unsigned short port, UINT host_found_msg)
{
    unsigned long addr=inet_addr(address);
    if( INADDR_NONE == addr && host_found_msg)
    {
        m_GetHostBuf = new char[MAXGETHOSTSTRUCT];
        m_GetHostTask = WSAAsyncGetHostByName( m_SinkWnd, host_found_msg, address, m_GetHostBuf, MAXGETHOSTSTRUCT );
        return 0;
    }
    return DoConnect(addr);
}
Esempio n. 8
0
int CResolver::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	ASSERT(socket);
CString hostName = socket->m_HostName;
int at = hostName.Find('@');
	if(at>=0)
		hostName=hostName.Mid(at+1);
	m_hAsync=WSAAsyncGetHostByName(m_hWnd,WM_RESOLVED,(LPCTSTR)hostName,(char*)socket->m_ResolveBuff,sizeof(socket->m_ResolveBuff));
	ASSERT(m_hAsync);
	return 0;
}
Esempio n. 9
0
File: cns.c Progetto: Akasurde/krb5
/*
 * The WINSOCK routine gethostbyname has a bug in both FTP and NetManage
 * implementations which causes the blocking hook, if any, not to be
 * called.  This routine attempts to work around the problem by using
 * the async routines to emulate the functionality of the synchronous
 * routines
 */
struct hostent *PASCAL
krb_gethostbyname(
		  const char *name)
{
  HWND hwnd;
  char buf[MAXGETHOSTSTRUCT];
  BOOL FARPROC blockinghook;
  WNDCLASS wc;
  static BOOL isregistered;

  blockinghook = WSASetBlockingHook(NULL);
  WSASetBlockingHook(blockinghook);

  if (blockinghook == NULL)
    return gethostbyname(name);

  if (RegisterWndClass() == NULL)
    return gethostbyname(name);

  if (!isregistered) {
    wc.style = 0;
    wc.lpfnWndProc = gethostbyname_wnd_proc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hlibinstance;
    wc.hIcon = NULL;
    wc.hCursor = NULL;
    wc.hbrBackground = NULL;
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = GETHOSTBYNAME_CLASS;

    if (!RegisterClass(&wc))
      return gethostbyname(name);

    isregistered = TRUE;
  }

  hwnd = CreateWindow(GETHOSTBYNAME_CLASS, "", WS_OVERLAPPED,
		      -100, -100, 0, 0, HWND_DESKTOP, NULL, hlibinstance, NULL);
  if (hwnd == NULL)
    return gethostbyname(name);

  htaskasync =
    WSAAsyncGetHostByName(hwnd, WM_ASYNC_COMPLETED, name, buf, sizeof(buf));
  b = blockinghook(NULL);
}
Esempio n. 10
0
/*---------------------------------------------------
  start SNTP session
---------------------------------------------------*/
BOOL SNTPStart(HWND hwndSNTP)
{
	char servername[BUFSIZE_SERVER];
	unsigned long serveraddr;
	
	if(m_socket != INVALID_SOCKET || m_hGetHost != NULL) return FALSE;
	
	// get server name and port
	m_port = GetServerPort(m_servername, servername);
	if(m_port == -1)
	{
		Log(hwndSNTP, "invalid server name"); return FALSE;
	}
	
	// make a socket
	m_socket = socket(PF_INET, SOCK_DGRAM, 0);
	if(m_socket == INVALID_SOCKET)
	{
		Log(hwndSNTP, "socket() failed");
		return FALSE;
	}
	
	serveraddr = inet_addr(servername);
	// if server name is not "XXX.XXX.XXX.XXX"
	if(serveraddr == INADDR_NONE)
	{
		// request IP address
		m_pGetHost = malloc(MAXGETHOSTSTRUCT);
		m_hGetHost = WSAAsyncGetHostByName(hwndSNTP, WSOCK_GETHOST,
			servername, m_pGetHost, MAXGETHOSTSTRUCT);
		if(m_hGetHost == NULL)
		{
			free(m_pGetHost); m_pGetHost = NULL;
			SocketClose(hwndSNTP, "WSAAsyncGetHostByName() failed");
			return FALSE;
		}
		return TRUE;
	}
	
	// send data
	SNTPSend(hwndSNTP, serveraddr);
	return TRUE;
}
Esempio n. 11
0
/*---------------------------------------------------
	start SNTP session
---------------------------------------------------*/
void SNTPStart(HWND hwnd, char *buf)
{
	char servername[256];
	unsigned long serveraddr;

	if(g_socket != -1 || g_hGetHost != NULL) return;

	// get server name and port
	g_port = GetServerPort(buf, servername);
	if(g_port == -1)
	{
		Log("invalid server name"); return;
	}

	// make a socket
	g_socket = socket(PF_INET, SOCK_DGRAM, 0);
	if(g_socket == INVALID_SOCKET)
	{
		Log("socket() failed");
		g_socket = (SOCKET)-1; return;
	}

	serveraddr = inet_addr((char*)servername);
	// if server name is not "XXX.XXX.XXX.XXX"
	if(serveraddr == -1)
	{
		// request IP address
		g_pGetHost = malloc(MAXGETHOSTSTRUCT);
		g_hGetHost = WSAAsyncGetHostByName(hwnd, WSOCK_GETHOST,
			servername, g_pGetHost, MAXGETHOSTSTRUCT);
		if(g_hGetHost == 0)
		{
			SocketClose(hwnd, "WSAAsyncGetHostByName() failed");
			return;
		}
		dwTickCountOnGetHost = GetTickCount();
		return;
	}

	// send data
	SNTPSend(hwnd, serveraddr);
}
Esempio n. 12
0
*/	DEVICE_CMD Read_DNS(REBREQ *sock)
/*
**		Initiate the GetHost request and return immediately.
**		Note the temporary results buffer (must be freed later).
**
***********************************************************************/
{
    char *host;
#ifdef HAS_ASYNC_DNS
	HANDLE handle;
#else
	HOSTENT *he;
#endif

	host = OS_ALLOC_ARRAY(char, MAXGETHOSTSTRUCT); // be sure to free it

#ifdef HAS_ASYNC_DNS
	if (!GET_FLAG(sock->modes, RST_REVERSE)) // hostname lookup
        handle = WSAAsyncGetHostByName(Event_Handle, WM_DNS, s_cast(sock->common.data), host, MAXGETHOSTSTRUCT);
	else
        handle = WSAAsyncGetHostByAddr(Event_Handle, WM_DNS, s_cast(&sock->special.net.remote_ip), 4, AF_INET, host, MAXGETHOSTSTRUCT);

	if (handle != 0) {
		sock->special.net.host_info = host;
		sock->requestee.handle = handle;
		return DR_PEND; // keep it on pending list
	}
#else
	// Use old-style blocking DNS (mainly for testing purposes):
	if (GET_FLAG(sock->modes, RST_REVERSE)) {
		he = gethostbyaddr(
			cast(char*, &sock->special.net.remote_ip), 4, AF_INET
		);
		if (he) {
			sock->special.net.host_info = host; //???
			sock->common.data = b_cast(he->h_name);
			SET_FLAG(sock->flags, RRF_DONE);
			return DR_DONE;
		}
	}
Esempio n. 13
0
File: pal.c Progetto: mixtile/xskit
int xsGetAddrByName(const char *hostname, xsSockAddr *addr, int tag)
{
	char *buf;
	UINT message = WM_XS_RESOLVE_MSG + tag;

	if (message > WM_XS_RESOLVE_MSG_END)
		return XS_EC_NOMEM;

	buf = (char *)xsMallocNative(MAXGETHOSTSTRUCT);
	if (buf == NULL)
		return XS_EC_NOMEM;

	g_xsResolveTags[tag].buf = buf;
	g_xsResolveTags[tag].handle = WSAAsyncGetHostByName(g_hMainWnd, message, hostname, buf, MAXGETHOSTSTRUCT);
	if (g_xsResolveTags[tag].handle == NULL)
	{
		int error = WSAGetLastError();
		XS_ERROR("[PAL]xsGetAddrByName: code:%d", error);
		return XS_EC_ERROR;
	}
	return XS_EC_IN_PROGRESS;
}
bool CTCPClientSocketImpl::Connect ( const char* szHost, unsigned short usPort )
{
    // Save the port
    m_usPort = usPort;

    // If we're already connected, disconnect
    if ( m_bIsConnected )
    {
        Disconnect ();
    }

    // If we have active host resolving, cancel it
    if ( m_bIsResolvingHost )
    {
        WSACancelAsyncRequest ( m_pAsyncHostResolving );
    }

    // Got a socket?
    if ( !m_Socket )
    {
        // No socket
        strcpy ( m_szLastError, "No socket initialized" );
        return false;
    }

    // Start async resolving it
    m_pAsyncHostResolving = WSAAsyncGetHostByName ( CCore::GetSingleton ().GetHookedWindow (), WM_ASYNCTRAP + m_uiID + 256, szHost, m_pHostInfo, MAXGETHOSTSTRUCT );
    if ( !m_pAsyncHostResolving )
    {
        // Failed
        strcpy ( m_szLastError, "Unable to start resolving" );
        return false;
    }
    m_bIsResolvingHost = true;
    return true;
}
BOOL COptionTab10::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();
	
  EnableToolTips(true);     // TOOL TIPS

  /* hide password */
  CString st;
  GetDlgItemText(IDC_prox,st);
  if (st.Find('@')>=0) {
    m_ctl_pwdhide.SetCheck(1);
    OnPwdhide();
  } else {
    m_ctl_pwdhide.SetCheck(0);
    OnPwdhide();
  }

  if (LANG_T(-1)) {    // Patcher en français
    SetDlgItemTextCP(this, IDC_proxyconfigure,LANG(LANG_I47b)); // "Configurer"
    SetDlgItemTextCP(this, IDC_ftpprox,LANG(LANG_I47c));
    SetDlgItemTextCP(this, IDC_PWDHIDE,LANG_HIDEPWD);  /* Hide password */
  }  

  // mode modif à la volée
  if (modify==1) {
    GetDlgItem(IDC_prox           ) ->ModifyStyle(0,WS_DISABLED);
    GetDlgItem(IDC_portprox       ) ->ModifyStyle(0,WS_DISABLED);
    GetDlgItem(IDC_proxyconfigure ) ->ModifyStyle(0,WS_DISABLED);
    GetDlgItem(IDC_proxtitle      ) ->ModifyStyle(0,WS_DISABLED);
    GetDlgItem(IDC_ftpprox        ) ->ModifyStyle(0,WS_DISABLED);
  } else {
    GetDlgItem(IDC_prox           ) ->ModifyStyle(WS_DISABLED,0);
    GetDlgItem(IDC_portprox       ) ->ModifyStyle(WS_DISABLED,0);
    GetDlgItem(IDC_proxyconfigure ) ->ModifyStyle(WS_DISABLED,0);
    GetDlgItem(IDC_proxtitle      ) ->ModifyStyle(WS_DISABLED,0);
    GetDlgItem(IDC_ftpprox        ) ->ModifyStyle(WS_DISABLED,0);
  }

  CString str;
  GetDlgItemText(IDC_prox,str);
  m_ctl_prox.ResetContent();
  m_ctl_prox.AddString("");

  HKEY phkResult;
  if (RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",0,KEY_READ,&phkResult)==ERROR_SUCCESS) {
    DWORD type=0;
    DWORD datasize=1000;
    char data[1024];
    data[0]='\0';
    if (RegQueryValueEx(phkResult,"ProxyServer",0,&type,(unsigned char*)&data,&datasize)==ERROR_SUCCESS) {
      if (datasize) {
        char* a=strchr(data,':');
        if (a)
          *a='\0';
        m_ctl_prox.AddString(data);
      }
    }
    RegCloseKey(phkResult);
  }
  SetDlgItemTextCP(this, IDC_prox,str);

  // Do not search for a proxy everytime
  CWinApp* pApp = AfxGetApp();
  if (pApp->GetProfileInt("Interface","FirstProxySearch",0) != 1) {
    pApp->WriteProfileInt("Interface","FirstProxySearch",1);
    
    // Launch proxy name search
    int i=0;
    WSAAsyncGetHostByName(this->m_hWnd,wm_ProxySearch+i,(ProxyDetectName[i]="proxy")   ,this->ProxyDetectBuff[i],sizeof(this->ProxyDetectBuff[i])); i++;
    WSAAsyncGetHostByName(this->m_hWnd,wm_ProxySearch+i,(ProxyDetectName[i]="www")     ,this->ProxyDetectBuff[i],sizeof(this->ProxyDetectBuff[i])); i++;
    WSAAsyncGetHostByName(this->m_hWnd,wm_ProxySearch+i,(ProxyDetectName[i]="ns")      ,this->ProxyDetectBuff[i],sizeof(this->ProxyDetectBuff[i])); i++;
    WSAAsyncGetHostByName(this->m_hWnd,wm_ProxySearch+i,(ProxyDetectName[i]="web")     ,this->ProxyDetectBuff[i],sizeof(this->ProxyDetectBuff[i])); i++;
    WSAAsyncGetHostByName(this->m_hWnd,wm_ProxySearch+i,(ProxyDetectName[i]="ntserv")  ,this->ProxyDetectBuff[i],sizeof(this->ProxyDetectBuff[i])); i++;
    WSAAsyncGetHostByName(this->m_hWnd,wm_ProxySearch+i,(ProxyDetectName[i]="gate")    ,this->ProxyDetectBuff[i],sizeof(this->ProxyDetectBuff[i])); i++;
    WSAAsyncGetHostByName(this->m_hWnd,wm_ProxySearch+i,(ProxyDetectName[i]="gateway") ,this->ProxyDetectBuff[i],sizeof(this->ProxyDetectBuff[i])); i++;
    WSAAsyncGetHostByName(this->m_hWnd,wm_ProxySearch+i,(ProxyDetectName[i]="firewall"),this->ProxyDetectBuff[i],sizeof(this->ProxyDetectBuff[i])); i++;
    WSAAsyncGetHostByName(this->m_hWnd,wm_ProxySearch+i,(ProxyDetectName[i]="cache")   ,this->ProxyDetectBuff[i],sizeof(this->ProxyDetectBuff[i])); i++;
    
  }
  
  return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}
Esempio n. 16
0
int
OpenTelnetConnection(void)
{
  int nReturn, ret;
  struct sockaddr_in sockaddr;
  char *p;
  static struct kstream_crypt_ctl_block ctl;
  char buf[128];

  tmpConfig = calloc(sizeof(CONFIG), 1);
	
  if (bAutoConnection) {
    tmpConfig->title = calloc(lstrlen(szHostName), 1);
    lstrcpy(tmpConfig->title, (char *) szHostName);
  } else {
    nReturn = DoDialog("OPENTELNETDLG", OpenTelnetDlg);
    if (nReturn == FALSE)
      return(FALSE);
  }
					 	
  con = (CONNECTION *) GetNewConnection();
  if (con == NULL)
    return(0);

  tmpConfig->width =
    GetPrivateProfileInt(INI_TELNET, INI_WIDTH, DEF_WIDTH, TELNET_INI);

  tmpConfig->height =
    GetPrivateProfileInt(INI_TELNET, INI_HEIGHT, DEF_HEIGHT, TELNET_INI);
  con->width = tmpConfig->width;
  con->height = tmpConfig->height;

  con->backspace = SaveHostName(tmpConfig->title, port_no);

  if (con->backspace == VK_BACK) {
    tmpConfig->backspace = TRUE;
    con->ctrl_backspace = 0x7f;
  } else {
    tmpConfig->backspace = FALSE;
    con->ctrl_backspace = 0x08;
  }

  tmpConfig->hwndTel = hWnd;
  con->pScreen = InitNewScreen(tmpConfig);
  if (!con->pScreen) {
    assert(FALSE);
    free(con->pScreen);
    free(con);
    free(tmpConfig);
    return(-1);
  }

  ret = (SOCKET) socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	
  if (ret == SOCKET_ERROR) {
    wsprintf(buf, "Socket error on socket = %d!", WSAGetLastError());
    MessageBox(NULL, buf, NULL, MB_OK | MB_ICONEXCLAMATION);
    if (con->pScreen != NULL)
      DestroyWindow(con->pScreen->hWnd);
    free(con);
    free(tmpConfig);
    return(-1);
  } 
	
  con->socket = ret;
	
  sockaddr.sin_family = AF_INET;  
  sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  sockaddr.sin_port = htons(0);
	
  ret = bind(con->socket, (struct sockaddr *) &sockaddr, 
	     (int) sizeof(struct sockaddr_in));
	
  if (ret == SOCKET_ERROR) {
    wsprintf(buf, "Socket error on bind!");
    MessageBox(NULL, buf, NULL, MB_OK | MB_ICONEXCLAMATION);
    if (con->pScreen != NULL)
      DestroyWindow(con->pScreen->hWnd);
    free(con);
    free(tmpConfig);
    return(-1);
  }

  WSAAsyncSelect(con->socket, hWnd, WM_NETWORKEVENT,
		 FD_READ | FD_CLOSE | FD_CONNECT);

  lstrcpy(szHostName, tmpConfig->title);
  p = strchr(szHostName, '@');
  if (p != NULL) {
    *p = 0;
    strcpy (szUserName, szHostName);
    strcpy(szHostName, ++p);
  }

  WSAAsyncGetHostByName(hWnd, WM_HOSTNAMEFOUND, szHostName, hostdata, 
			MAXGETHOSTSTRUCT);

  ctl.encrypt = auth_encrypt;
  ctl.decrypt = auth_decrypt;
  ctl.init = auth_init;
  ctl.destroy = auth_destroy;

  con->ks = kstream_create_from_fd(con->socket, &ctl, NULL);

  if (con->ks == NULL)
    return(-1);

  kstream_set_buffer_mode(con->ks, 0);

  return(1);
}
Esempio n. 17
0
int WAsyncSocket::Connect(char *host,unsigned short int port)
{
	m_port=port;
	WSAAsyncGetHostByName(m_hwnd,WM_GOT_HOST_BY_NAME_MESSAGE,host,m_hostent_buf,sizeof(m_hostent_buf));
	return 0;
}
Esempio n. 18
0
// ウィンドウメッセージを処理してデータを受信する
// 受信データはrecvBufに追記される
// 戻り値: 負値=切断した(-2=正常,-1=中断), 0=正常に処理した
int CAsyncSocket::ProcessRecv(WPARAM wParam, LPARAM lParam, std::vector<char> *recvBuf)
{
	UINT imAddr = INADDR_NONE;

	if (bReady_) {
		// 待機中
		if (wParam || lParam) {
			return 0;
		}
		bReady_ = false;
		if (bShutdown_) {
			bShutdown_ = false;
			return -1;
		}
		if ((imAddr = inet_addr(name_)) == INADDR_NONE) {
			hGethost_ = WSAAsyncGetHostByName(hwnd_, msg_, name_, hostBuf_, sizeof(hostBuf_));
			return hGethost_ ? 0 : -1;
		}
		// IPアドレス即値(名前解決を省略)

	} else if (hGethost_) {
		// 名前解決中
		bool bValid = wParam == (WPARAM)hGethost_ && WSAGETASYNCERROR(lParam) == 0;
		hGethost_ = NULL;
		if (bShutdown_) {
			bShutdown_ = false;
			return -1;
		}
		if (!bValid || (imAddr = *(UINT*)((HOSTENT*)hostBuf_)->h_addr) == INADDR_NONE) {
			return -1;
		}
	}

	if (imAddr != INADDR_NONE) {
		// 接続
		if ((soc_ = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
			return -1;
		}
		WSAAsyncSelect(soc_, hwnd_, msg_, FD_WRITE | FD_READ | FD_CLOSE);
		struct sockaddr_in addr = {0};
		addr.sin_family = AF_INET;
		addr.sin_addr.s_addr = imAddr;
		addr.sin_port = htons(port_);
		if (connect(soc_, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) {
			closesocket(soc_);
			soc_ = INVALID_SOCKET;
			return -1;
		}
		return 0;
	}

	if (soc_ != INVALID_SOCKET) {
		// 送受信中
		if (wParam == (WPARAM)soc_) {
			switch(WSAGETSELECTEVENT(lParam)) {
			case FD_WRITE:
				if (!bShutdown_) {
					while (!sendBuf_.empty()) {
						int wrote = send(soc_, &sendBuf_.front(), (int)sendBuf_.size(), 0);
						if (wrote == SOCKET_ERROR) {
							// WSAEWOULDBLOCK時はつぎのFD_WRITEに先送り
							if (WSAGetLastError() != WSAEWOULDBLOCK) {
								Shutdown();
							}
							break;
						}
						sendBuf_.erase(sendBuf_.begin(), sendBuf_.begin() + wrote);
					}
					if (sendBuf_.empty() && !bKeepSession_ && bDoHalfClose_) {
						// ハーフクローズ
						// Bitdefender環境で受信が中断する不具合を確認(2013-10-28)
						shutdown(soc_, SD_SEND);
					}
				}
				return 0;
			case FD_READ:
				for (;;) {
					char buf[2048];
					int read = recv(soc_, buf, sizeof(buf), 0);
					if (read == SOCKET_ERROR || read <= 0) {
						// FD_CLOSEで拾うので無視
						return 0;
					}
					recvBuf->insert(recvBuf->end(), &buf[0], &buf[read]);
				}
				break;
			case FD_CLOSE:
				if (WSAGETSELECTERROR(lParam) != 0) {
					Close();
					return -1;
				}
				for (;;) {
					char buf[2048];
					int read = recv(soc_, buf, sizeof(buf), 0);
					if (read == SOCKET_ERROR || read <= 0) {
						Close();
						return read == 0 ? -2 : -1;
					}
					recvBuf->insert(recvBuf->end(), &buf[0], &buf[read]);
				}
				break;
			}
		}
		return 0;
	}
	return -1;
}
Esempio n. 19
0
void NetworkStream_Win32::Open( const RString &sHost, int iPort, ConnectionType ct )
{
	m_Mutex.Lock();
	if( m_State == STATE_CANCELLED )
	{
		m_Mutex.Unlock();
		return;
	}

	// Always shut down a stream completely before reusing it.
	ASSERT_M( m_State == STATE_IDLE, ssprintf("%s:%i: %i", sHost.c_str(), iPort, m_State) );

	m_sHost = sHost;
	m_iPort = iPort;

	// Look up the hostname.
	hostent *pHost = NULL;
	char pBuf[MAXGETHOSTSTRUCT];
	{
		pHost = (hostent *) pBuf;

		ResolveMessageWindow mw;
		m_hResolve = WSAAsyncGetHostByName(
			mw.GetHwnd(),
			WM_USER,
			m_sHost,
			(char *) pHost,
			MAXGETHOSTSTRUCT
		);
		m_hResolveHwnd = mw.GetHwnd();
		m_Mutex.Unlock();

		mw.Run();

		m_Mutex.Lock();
		m_hResolve = NULL;
		m_hResolveHwnd = NULL;
		if( m_State == STATE_CANCELLED )
		{
			m_Mutex.Unlock();
			return;
		}
		int iError = mw.GetResult();
		if( iError )
		{
			SetError( ssprintf("DNS error: %s", WinSockErrorToString(iError).c_str() ) );
			m_Mutex.Unlock();
			return;
		}
		m_Mutex.Unlock();
	}

	{
		sockaddr_in addr;
		addr.sin_addr.s_addr = *(DWORD *)pHost->h_addr_list[0];
		addr.sin_family = PF_INET;
		addr.sin_port = htons( (uint16_t) iPort );

		m_Mutex.Lock();
		m_Socket = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP );
		if( m_Socket == INVALID_SOCKET )
		{
			int iError = WSAGetLastError();
			SetError( ssprintf("Error creating socket: %s", WinSockErrorToString(iError).c_str() ) );
			return;
		}

		/* Set up the completion event to be signalled when these events occur.
		 * This also sets the socket to nonblocking. */
		WSAEventSelect( m_Socket, m_hCompletionEvent, FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE );

		//fcntl( m_Socket, O_NONBLOCK, 1 );

		// Start opening the connection.
		int iResult = connect(m_Socket, (SOCKADDR *) &addr, sizeof(addr));

		m_Mutex.Unlock();

		// We expect EINPROGRESS/WSAEWOULDBLOCK.
		if( iResult == SOCKET_ERROR )
		{
			// Block until the connection attempt completes.
			int iError = WSAGetLastError();
			if( iError == WSAEWOULDBLOCK )
				iError = WaitForCompletionOrCancellation( FD_CONNECT_BIT );
			if( iError )
			{
				SetError( ssprintf("Couldn't connect: %s", WinSockErrorToString(iError).c_str() ) );
				return;
			}
		}
	}

	m_State = STATE_CONNECTED;
}
Esempio n. 20
0
*/	DEVICE_CMD Lookup_Socket(REBREQ *sock)
/*
**		Initiate the GetHost request and return immediately.
**		This is very similar to the DNS device.
**		The request will pend until the main event handler gets WM_DNS.
**		Note the temporary results buffer (must be freed later).
**		Note we use the sock->handle for the DNS handle. During use,
**		we store the TCP socket in the length field.
**
***********************************************************************/
{
#ifdef TO_WIN32
	HANDLE handle;
#endif
	HOSTENT *host;

#ifdef HAS_ASYNC_DNS
	// Check if we are polling for completion:
	if (host = (HOSTENT*)(sock->net.host_info)) {
		// The windows main event handler will change this when it gets WM_DNS event:
		if (!GET_FLAG(sock->flags, RRF_DONE)) return DR_PEND; // still waiting
		CLR_FLAG(sock->flags, RRF_DONE);
		if (!sock->error) { // Success!
			host = (HOSTENT*)sock->net.host_info;
			COPY_MEM((char*)&(sock->net.remote_ip), (char *)(*host->h_addr_list), 4); //he->h_length);
			Signal_Device(sock, EVT_LOOKUP);
		}
		else
			Signal_Device(sock, EVT_ERROR);
		OS_Free(host);	// free what we allocated earlier
		sock->socket = sock->length; // Restore TCP socket saved below
		sock->net.host_info = 0;
		return DR_DONE;
	}

	// Else, make the lookup request:
	host = OS_Make(MAXGETHOSTSTRUCT); // be sure to free it
	handle = WSAAsyncGetHostByName(Event_Handle, WM_DNS, sock->data, (char*)host, MAXGETHOSTSTRUCT);
	if (handle != 0) {
		sock->net.host_info = host;
		sock->length = sock->socket; // save TCP socket temporarily
		sock->handle = handle;
		return DR_PEND; // keep it on pending list
	}
	OS_Free(host);
#else
	// Use old-style blocking DNS (mainly for testing purposes):
	host = gethostbyname(sock->data);
	sock->net.host_info = 0; // no allocated data

	if (host) {
		COPY_MEM((char*)&(sock->net.remote_ip), (char *)(*host->h_addr_list), 4); //he->h_length);
		CLR_FLAG(sock->flags, RRF_DONE);
		Signal_Device(sock, EVT_LOOKUP);
		return DR_DONE;
	}
#endif

	sock->error = GET_ERROR;
	//Signal_Device(sock, EVT_ERROR);
	return DR_ERROR; // Remove it from pending list
}