gpt4 book ai didi

c - 如何连接到 c 中的 bit torrent tracker

转载 作者:可可西里 更新时间:2023-11-01 02:35:22 25 4
gpt4 key购买 nike

我想连接到一个 bit torrent tracker,http://tracker.thepiratebay.org . gethostbyname() 一直返回 null,我应该如何解决这个问题?您还看到此代码还有其他问题吗?

    int sock;
struct sockaddr_in servAddr;
int portNum = 80;

if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0){
printf("fail create socket");
return 0;
}

char *path = "http://tracker.thepiratebay.org/";
struct hostent *hp = gethostbyname(path);
if(hp==NULL){
printf("null");
else{

memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
memcpy( (char *) &servAddr.sin_addr.s_addr, (char *) hp->h_addr, hp->h_length );
servAddr.sin_port = htons(portNum);
}

//send request to tracker server
if (send(sock, requestToSend, strlen(requestToSend), 0) != strlen(requestToSend)){
printf("fail send");
return 0;
}

最佳答案

这里的问题是 http://tracker.thepiratebay.org/ 是一个 URL,但是 gethostbyname() 只需要主机名。主机名为 tracker.thepiratebay.org

如果你只使用 libcurl 会容易得多,它将为您处理所有 HTTP 内容。在连接到 HTTP 服务器的应用程序中使用 libcurl 是非常常见的;这是一个很棒的图书馆。它肯定比套接字编程更容易。

使用getaddrinfo()

gethostbyname() 的现代替代方法是 getaddrinfo()。这并不是说 gethostbyname() 不能满足您的要求,而是 getaddrinfo() 在所有可能的方面都做得更好。

struct addrinfo hint, *ap;
memset(&hint, 0, sizeof(hint));
hint.ai_family = AF_UNSPEC;
hint.ai_socktype = SOCK_STREAM;
int r = getaddrinfo("tracker.thepiratebay.org", "http", &hint, &ap);

这不仅会为您提供所需主机的地址,还会填写端口号。可以使用"http"作为端口,也可以使用"80"作为端口,它们是一样的(只要/etc/services 有正确的条目)。

其他问题

这一行是错误的。

memcpy( (char *) &servAddr.sin_addr.s_addr, (char *)  hp->h_addr, hp->h_length );

您不知道 gethostbyname() 返回了一个 IPv4 地址,尝试将其复制到 struct sockaddr_in 中是愚蠢的。如果 gethostbyname() 返回了一个 IPv6 地址,那么您就破坏了您的堆栈,您的程序将会崩溃——或者更糟的是,它可能不会崩溃。

检查它是否返回 IPv4 地址,或者简单地将 hp->h_addr 复制到从 malloc(hp-> 返回的通用 struct sockaddr h_length)。这有点丑陋,但就是这样。

最后,将参数转换为 memcpy() 是错误的。这不是错误,但这是错误的。不要这样做,否则可能会导致合法的编译器错误被抑制,例如,如果您不小心将 int 转换为 char *

关于c - 如何连接到 c 中的 bit torrent tracker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13695848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com