int HttpConnector::Recv(char *buf, int size, int timeout) { return nd_connector_raw_waitdata( m_conn, buf, size, timeout) ; }
void ProxySession::UpdateRemote() { int ret ; char buf[1024*16] ; if(!nd_connector_valid((nd_netui_handle)m_remote_handle)) { return ; } ret = nd_connector_raw_waitdata(m_remote_handle, buf, sizeof(buf), 0) ; //ret = m_remote_connector.RecvRawData(buf, sizeof(buf),0) ; if(0==ret || (ret == -1 && NDERR_WUOLD_BLOCK !=nd_object_lasterror(m_remote_handle)) ) { Shutdown(); } if(ret <= 0) { return ; } if (!m_is_udp) { SendRawData(buf, ret) ; return ; } //读取地址 struct sockaddr_in* read_addr = nd_udp_read_addr(m_remote_handle) ; if (read_addr->sin_addr.s_addr==m_client_addr.sin_addr.s_addr && read_addr->sin_port==m_client_addr.sin_port ) { //来自client int sock_len; struct sockaddr_in aim_addr ; if(buf[0]!=0 || buf[1]!=0 || buf[2]!=0) { return ; } if (buf[3]==1) { if(ret <= 10) { return ; } aim_addr.sin_addr.s_addr =*(int*) &buf[4] ; aim_addr.sin_port = *(short*) &buf[8] ; sock_len = 10; ret -= 10 ; } else if(buf[3]==3){ int sock_len = buf[4] + 5; if ( sock_len >= ret) { return ; } aim_addr.sin_port = *(short *) &buf[sock_len] ; sock_len += 2 ; if ( sock_len >= ret) { return ; } ret -= sock_len ; } aim_addr.sin_family = AF_INET ; memcpy(buf, buf+sock_len, ret) ; nd_udp_sendto(m_remote_handle,buf,ret, &aim_addr) ; } else { //来自远程 nd_proxy_sendto(nd_connector_fd(m_remote_handle),buf,ret, read_addr, &m_client_addr) ; } }