- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想连接到一个 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/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!