连接到C ++中的UDP跟踪器

伊森

我正在尝试使用下面的代码连接到UDP跟踪器服务器,但是我没有从跟踪器获得任何响应...

我从此链接中搜集了以下信息:http : //xbtt.sourceforge.net/udp_tracker_protocol.html

我以为我明白了……但显然没有。该代码执行正常,然后挂在对RecvFrom的调用上。所以我想我不是在发送正确的数据,还是在将其发送到错误的地方.....

struct ConnectionIdRequest_t {

    uint64_t connectionId;
    uint32_t action;
    int32_t transactionId;
} typedef ConnectionIdRequest;

const bool UdpTorrentTrackerComm::initiateConnection(const int amountUploaded, 
const int amountDownloaded, 
const int amountLeft) {

    struct sockaddr_in serverAddress, clientAddress;
    struct hostent * host;
    struct in_addr address;

    //Setup dummy client address
    clientAddress.sin_family = AF_INET;
    clientAddress.sin_addr.s_addr = htonl(INADDR_ANY);
    clientAddress.sin_port = htons(0);

    //Setup server address
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_port = htons(portNumber);

    //SETUP in_addr server address
    //If we have an IP
    if (trackerAddress) {

        if (isIp4Address(*trackerAddress)) {

            //retrieve hostname from ip address 
            if (inet_aton(trackerAddress->c_str(), &address)) {

                host = gethostbyaddr((const char *) &address, sizeof(address), AF_INET);
                trackerHostname = new std::string(host->h_name);
            }
            else {
                return false;
            }
        }
        else {
            return false;
        }
    }
    else {
        //retrieve ip address from hostname
        host = gethostbyname(trackerHostname->c_str());
        address.s_addr = ((struct in_addr *) host->h_addr_list)->s_addr;
        trackerAddress = new std::string(inet_ntoa(address));
    }
std::cout << *trackerAddress << std::endl;
    //Convert trackerAddress to network format
    if(!inet_aton(trackerAddress->c_str(), &serverAddress.sin_addr)) {
        return false;
    }

    int sockFd = -1;
    //Add IPv6 in the future
    if ((sockFd = Socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        return false;
    }

    //Bind my address to the socket
    if (Bind(sockFd, (struct sockaddr *) &clientAddress, sizeof(clientAddress)) == - 1) {
        return false;
    }

    std::cout << "SendTo\n";
    ConnectionIdRequest * idRequest = createConnectionIdRequest();
    if (SendTo(sockFd, idRequest, sizeof(*idRequest), 0, 
        (struct sockaddr *) &serverAddress, sizeof(serverAddress)) == -1) {
        return false;
    }
    timeRequestSent = clock();
std::cout << "Sent: " << idRequest->connectionId << "|||" << idRequest->action << "|||" << idRequest->transactionId << std::endl;
    std::cout << "RecvFrom\n";
    char buffer[3000];
    socklen_t serverAddressLength = sizeof(serverAddress);
    while(true) {
        if (RecvFrom(sockFd, buffer, 3000, 0, 
            (struct sockaddr *) &serverAddress, &serverAddressLength) == - 1) {
            break;
            std::cout << "breaking...\n";
        }
    }
    std::cout << "The buffer is: " << buffer << std::endl;
    Close(sockFd);

    return true;
}

ConnectionIdRequest * UdpTorrentTrackerComm::createConnectionIdRequest() {

    ConnectionIdRequest * idRequest = new ConnectionIdRequest;
    generatePeerId();
    idRequest->connectionId = htonll(0x41727101980);
    idRequest->action = htonl(CONNECT);
    idRequest->transactionId = htonl(*peerId);

    return idRequest;
}

编辑:好吧,我做了Arvid建议的一项更改,但这没有任何帮助。我正在检查并确保要转换的所有字节都按网络字节顺序转换...也许我丢失了某些东西...

伊森

我最终得到它的工作。问题主要是我没有将需要转换的所有值都转换为大端字节序(网络顺序),也没有使用过时的函数(gethostbyname等)。

如果您想了解更多详细信息,请发表评论。

这是对我建立与跟踪器服务器链接的代码:

注意:serverAddress和clientAddress是类型的类字段:struct sockaddr_in

const bool UdpTorrentTrackerComm::initiateConnection() {

    //Setup dummy client address
    clientAddress.sin_family = AF_INET;
    clientAddress.sin_addr.s_addr = htonl(INADDR_ANY);
    clientAddress.sin_port = htons(51413);

    //Setup server address
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_port = htons(portNumber);

    //SETUP in_addr server address
    //If we have an IP
    if (trackerAddress) {

        if (isIp4Address(*trackerAddress)) {

            //Convert human readable trackerAddress to network byte order ip address and place in serverAddress.sin_addr
            if (inet_pton(AF_INET, trackerAddress->c_str(), &(serverAddress.sin_addr))) {

                //retrieve hostname and service type from ip address        
                char hostBuffer[100], serviceBuffer[100];
                getnameinfo((struct sockaddr *) &serverAddress, sizeof(serverAddress), 
                    hostBuffer, sizeof(hostBuffer), 
                    serviceBuffer, sizeof(serviceBuffer), 
                    NI_NAMEREQD | NI_DGRAM);

                trackerHostname = new std::string(hostBuffer);
            }
            else {
                return false;
            }
        }
        else {
            return false;
        }
    }
    else {

        //Setup structs to be used in getaddrinfo
        struct addrinfo hints;
        struct addrinfo * result, * resultPointer;
        hints.ai_family = AF_INET;
        hints.ai_socktype = SOCK_DGRAM;
        hints.ai_flags = 0;
        hints.ai_protocol = 0;

        //Convert port number to string to pass to getaddrinfo
        std::stringstream ss;
        ss << portNumber;
        std::string portNumberString = ss.str();

        //retrieve ip address from hostname--------
        if (GetAddrInfo(trackerHostname->c_str(), portNumberString.c_str(), &hints, &result) != 0) {
            return false;
        }

        //Iterate over results for IP address V4 (ADD V6 later!)
        char ipBuffer[INET_ADDRSTRLEN];
        for (resultPointer = result; resultPointer != NULL; resultPointer = resultPointer->ai_next) {

            //If we have an IPv4 address
            if (resultPointer->ai_family == AF_INET) {

                //convert to presentation format and store in ipBuffer
                inet_ntop(AF_INET, &((struct sockaddr_in *) resultPointer->ai_addr)->sin_addr, ipBuffer, INET_ADDRSTRLEN);
            }
        }
        //Free result
        freeaddrinfo(result);

        //Convert ipBuffer to std::string and store in trackerAddress field
        trackerAddress = new std::string(ipBuffer);

        //Convert trackerAddress to network format
        if(!inet_pton(AF_INET, trackerAddress->c_str(), &serverAddress.sin_addr)) {
            return false;
        }

    }

    int sockFd = -1;
    //Add IPv6 in the future
    if ((sockFd = Socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        return false;
    }

    //Bind my address to the socket
    if (Bind(sockFd, (struct sockaddr *) &clientAddress, sizeof(clientAddress)) == - 1) {
        return false;
    }

    //Send a request to the tracker
    ConnectionIdRequest * idRequest = createConnectionIdRequest();
    if (SendTo(sockFd, idRequest, sizeof(*idRequest), 0, 
        (struct sockaddr *) &serverAddress, sizeof(serverAddress)) == -1) {
        return false;
    }
    timeRequestSent = clock();

    //Re-send until timeout.....
    ConnectionIdResponse idResponse;
    socklen_t serverAddressLength = sizeof(serverAddress);
    while((timeRequestSent - clock()) / 1000 < SECONDS_UNTIL_TIMEOUT) {

        //Response received!
        if (RecvFrom(sockFd, &idResponse, sizeof(idResponse), 0, 
            (struct sockaddr *) &serverAddress, &serverAddressLength) > 0) {
            break;
        }
    }

    //Set class fields that will persist
    activeSocket = sockFd;
    connectionId = ntohll(idResponse.connectionId);

    delete idRequest;

    return true;
}

其中两个结构ConnectionIdResponse和ConnectionIdRequest定义为:

    /* Struct used to send a request for a connectionId to the tracker server.*/
struct ConnectionIdRequest_t {

    uint64_t connectionId;
    uint32_t action;
    uint32_t transactionId;
} typedef ConnectionIdRequest;

/* Struct used in receipt of a request for a connectionId from the tracker server. */
struct ConnectionIdResponse_t {
    uint32_t action;
    uint32_t transactionId;
    uint64_t connectionId;
} typedef ConnectionIdResponse;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么传输BitTorrent客户端说“无法连接到跟踪器”?

来自分类Dev

为什么传输BitTorrent客户端说“无法连接到跟踪器”?

来自分类Dev

Utorrent跟踪器列表显示“连接超时”。

来自分类Dev

如何在手机跟踪器应用程序中实现简单的“无连接吐司...”

来自分类Dev

简单的光线跟踪器,漫反射着色问题c ++

来自分类Dev

无法在C#中连接到SalesForce

来自分类Dev

在 C# 中连接到 tableau postgresql

来自分类Dev

将USB连接器A型连接到C型

来自分类Dev

如何将卡片(跟踪器看板任务)链接到git commit?

来自分类Dev

Xamarin中的跟踪器布局

来自分类Dev

Qt客户端-连接到C服务器

来自分类Dev

从javascript连接到C#服务器

来自分类Dev

连接到SMTP服务器Windows C ++

来自分类Dev

使用C#连接到Android模拟器

来自分类Dev

使用C ++连接到服务器并收集信息

来自分类Dev

使用C#连接到GPS Deamon服务器

来自分类Dev

使用C#中的凭据连接到TFS

来自分类Dev

在C#中连接到Microsoft Exchange PowerShell

来自分类Dev

在C#中连接到SQL数据库

来自分类Dev

无法连接到C中的数据库

来自分类Dev

在C#中连接到大型Oracle数据库

来自分类Dev

将MySQL表连接到C#中的DataGridView控件

来自分类Dev

在 C# 中连接到 REST 网络服务

来自分类Dev

如何使用连接器/ C ++连接到远程ipv6 mysql服务器

来自分类Dev

任何 AWS 都可以使用 tcp 套接字连接捕获通过 GPS 跟踪器发送的数据吗?

来自分类Dev

无法在C#程序中连接到SQL Server,但是系统能够连接

来自分类Dev

无法在C#程序中连接到SQL Server,但是系统能够连接

来自分类Dev

如何将.cshtml中的表单连接到C#中的控制器?

来自分类Dev

C ++ [UDP]如何跟踪服务器上所有已连接的(客户端)套接字连接?

Related 相关文章

  1. 1

    为什么传输BitTorrent客户端说“无法连接到跟踪器”?

  2. 2

    为什么传输BitTorrent客户端说“无法连接到跟踪器”?

  3. 3

    Utorrent跟踪器列表显示“连接超时”。

  4. 4

    如何在手机跟踪器应用程序中实现简单的“无连接吐司...”

  5. 5

    简单的光线跟踪器,漫反射着色问题c ++

  6. 6

    无法在C#中连接到SalesForce

  7. 7

    在 C# 中连接到 tableau postgresql

  8. 8

    将USB连接器A型连接到C型

  9. 9

    如何将卡片(跟踪器看板任务)链接到git commit?

  10. 10

    Xamarin中的跟踪器布局

  11. 11

    Qt客户端-连接到C服务器

  12. 12

    从javascript连接到C#服务器

  13. 13

    连接到SMTP服务器Windows C ++

  14. 14

    使用C#连接到Android模拟器

  15. 15

    使用C ++连接到服务器并收集信息

  16. 16

    使用C#连接到GPS Deamon服务器

  17. 17

    使用C#中的凭据连接到TFS

  18. 18

    在C#中连接到Microsoft Exchange PowerShell

  19. 19

    在C#中连接到SQL数据库

  20. 20

    无法连接到C中的数据库

  21. 21

    在C#中连接到大型Oracle数据库

  22. 22

    将MySQL表连接到C#中的DataGridView控件

  23. 23

    在 C# 中连接到 REST 网络服务

  24. 24

    如何使用连接器/ C ++连接到远程ipv6 mysql服务器

  25. 25

    任何 AWS 都可以使用 tcp 套接字连接捕获通过 GPS 跟踪器发送的数据吗?

  26. 26

    无法在C#程序中连接到SQL Server,但是系统能够连接

  27. 27

    无法在C#程序中连接到SQL Server,但是系统能够连接

  28. 28

    如何将.cshtml中的表单连接到C#中的控制器?

  29. 29

    C ++ [UDP]如何跟踪服务器上所有已连接的(客户端)套接字连接?

热门标签

归档