Sockets 我可以通过UDT连接HTTP服务器吗?

Sockets 我可以通过UDT连接HTTP服务器吗?,sockets,udp-data-transfer,Sockets,Udp Data Transfer,我想在我的电脑和端口80上的HTTP服务器之间建立连接。这可行吗 我尝试了以下代码,但没有成功。它报告了一个错误: 连接设置失败:连接超时 从我的角度来看,UDT使用UDP,那么我的计划是否可行 if ( UDT::startup() == UDT::ERROR ) { cout << "UDT::startup: " << UDT::getlasterror().getErrorMessage() << "and " << strerro

我想在我的电脑和端口80上的HTTP服务器之间建立连接。这可行吗

我尝试了以下代码,但没有成功。它报告了一个错误:

连接设置失败:连接超时

从我的角度来看,UDT使用UDP,那么我的计划是否可行

if ( UDT::startup() == UDT::ERROR )
{
    cout << "UDT::startup: " << UDT::getlasterror().getErrorMessage() << "and " << strerror ( errno ) << endl;
    exit ( -1 ); 
}

UDTSOCKET conn_serv_fd;
struct sockaddr_in serv_addr;

if (  ( conn_serv_fd = UDT::socket ( AF_INET, SOCK_STREAM, 0 ) ) == UDT::INVALID_SOCK  )
{
    cout << "create UDT::conn_serv_fd: " << UDT::getlasterror().getErrorMessage() << "and " << strerror ( errno ) << endl;
    exit ( -1 );
}

serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(80);
serv_addr.sin_addr = *((struct in_addr *)h->h_addr);
//if udt is udp based which is connectionless, why connect() API is needed ???
if (  UDT::ERROR == UDT::connect ( conn_serv_fd, (struct sockaddr*)&serv_addr, sizeof(struct sockaddr) )  )
{
    //bug: connect: Connection setup failure: connection time out.
    cout << "connect: " << UDT::getlasterror().getErrorMessage() << "and " << strerror ( errno ) << endl;
    exit ( -1 );
}

if (  UDT::ERROR == UDT::send ( conn_serv_fd, first_req, first_req_size, 0 )  )
{
    cout << "send: " << UDT::getlasterror().getErrorMessage();
    exit ( -1 );
}
else
{
    cout<<"send first req already!"<<endl;
}
我将
gethostbyname()
替换为
getaddrinfo()
,现在它看起来像:

        char *hostName = getHostName ( first_req, first_req_size );

        struct addrinfo* res, * cur;

        struct addrinfo hints;
        memset(&hints, 0, sizeof(struct addrinfo));
        hints.ai_family = AF_INET;
        hints.ai_socktype = SOCK_STREAM;

        if (0 != getaddrinfo( hostName, NULL, &hints, &res))
        {
            cout<<"can't getaddrinfo! "<<strerror ( errno )<<endl;
            exit ( -1 );
        }

        bool connected = 0;
        for ( cur = res; cur != NULL; cur = cur->ai_next ) 
        {

            struct sockaddr_in* addr = (struct sockaddr_in *)cur->ai_addr;

            char ipbuf[16];
            cout << "try to connect to ip: "<< inet_ntop ( AF_INET, &addr -> sin_addr, ipbuf, 16) << endl;

            serv_addr.sin_addr = addr->sin_addr;

            if (  UDT::ERROR == UDT::connect ( conn_serv_fd, (struct sockaddr*)&serv_addr, sizeof(struct sockaddr) )  )
            {
                cout << "connect: " << UDT::getlasterror().getErrorMessage() << "and sys error: " << strerror ( errno ) << endl;
                UDT::close ( conn_serv_fd );
                continue;
            }
            else
            {
                cout << "connect successfully!" << endl;
                connected = 1;
                break;
            }
        }

        freeaddrinfo(res);
        delete []hostName;
        delete []first_req;

        if ( !connected )
        {
            cout << "connection setup failure!" <<endl;
            exit ( -1 );
        }
char*hostName=getHostName(第一个请求,第一个请求大小);
结构addrinfo*res,*cur;
结构addrinfo提示;
memset(&hints,0,sizeof(struct addrinfo));
hits.ai_family=AF_INET;
hits.ai_socktype=SOCK_流;
if(0!=getaddrinfo(主机名、NULL、提示和res))
{

也许你不能在UDP上使用HTTP,但从我在UDT文档中看到的情况来看,UDT支持TCP(否则你根本不能使用
SOCK\u流
),所以此代码应该可以工作,前提是
h->h_addr
包含一个有效的IPv4地址,您的电脑可以访问该地址。您在哪里以及如何填充
h->h_addr
?您没有显示该代码。首先,感谢您的编辑,这非常好。实际上,我正在开发一个基于iptables的透明代理,它接收请求和请求结束接收到服务器的内容。我从接收到的请求中获取IPv4地址,在请求中,
主机:
\r\n
之间的任何内容都是我的目标地址(如www.stackoverflow.com)。我使用
gethostbyname()
系统API获取IPv4地址。再次感谢!@Remy Lebeau我只需发布我的获取地址的代码。@Remy Lebeau您使用的是
AF\u INET
(IPv4)套接字,因此请确保
h->h\u addrtype
在使用
h->h\u addr
之前匹配
AF\u INET
。主机名可以解析为IPv6(
AF\u INET6
)而不是IPv4。主机名解析返回IP列表,因此您应该尝试将
connect()
连接到每个IP,直到其中一个成功。主机名可以解析为IP从您当前的网络位置无法访问,因此您应该全部尝试。现在,您只尝试第一个。通过
h->h\u addr\u列表
循环,而不是使用
h->h\u addr
(注意:您应该使用
getaddrinfo()
),我将尝试。您太好了!谢谢!
        char *hostName = getHostName ( first_req, first_req_size );

        struct addrinfo* res, * cur;

        struct addrinfo hints;
        memset(&hints, 0, sizeof(struct addrinfo));
        hints.ai_family = AF_INET;
        hints.ai_socktype = SOCK_STREAM;

        if (0 != getaddrinfo( hostName, NULL, &hints, &res))
        {
            cout<<"can't getaddrinfo! "<<strerror ( errno )<<endl;
            exit ( -1 );
        }

        bool connected = 0;
        for ( cur = res; cur != NULL; cur = cur->ai_next ) 
        {

            struct sockaddr_in* addr = (struct sockaddr_in *)cur->ai_addr;

            char ipbuf[16];
            cout << "try to connect to ip: "<< inet_ntop ( AF_INET, &addr -> sin_addr, ipbuf, 16) << endl;

            serv_addr.sin_addr = addr->sin_addr;

            if (  UDT::ERROR == UDT::connect ( conn_serv_fd, (struct sockaddr*)&serv_addr, sizeof(struct sockaddr) )  )
            {
                cout << "connect: " << UDT::getlasterror().getErrorMessage() << "and sys error: " << strerror ( errno ) << endl;
                UDT::close ( conn_serv_fd );
                continue;
            }
            else
            {
                cout << "connect successfully!" << endl;
                connected = 1;
                break;
            }
        }

        freeaddrinfo(res);
        delete []hostName;
        delete []first_req;

        if ( !connected )
        {
            cout << "connection setup failure!" <<endl;
            exit ( -1 );
        }