我试图发送一个带有特定负载的UDP数据包,但在运行时对sendto()
的调用失败了。这是我第一次尝试套接字编程。
原始代码是一个更大的项目的一部分,但我已经将其简化为一个更简单的测试程序:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#define SIZE 16
int main()
{
int sock;
struct sockaddr *addr;
socklen_t addrlen;
struct addrinfo hints, *result;
char *url = "tracker.openbittorrent.com";
void *payload = malloc(SIZE);
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = 0;
hints.ai_protocol = IPPROTO_UDP;
hints.ai_canonname = NULL;
hints.ai_addr = NULL;
hints.ai_next = NULL;
int er = getaddrinfo(url, NULL, &hints, &result);
if (er != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(er));
exit(EXIT_FAILURE);
}
sock = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (sock == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
if (sendto(sock, payload, SIZE, 0, result->ai_addr, result->ai_addrlen) == -1)
perror("sendto");
}
下面是输出:sendto: Invalid argument
根据请求,一些gdb输出:
(gdb) p result->ai_addr->sa_data
$3 = "\000\000_\327>\005\000\000\000\000\000\000\000"
(gdb) p result->ai_addr->sa_family
$4 = 2
(gdb) p result->ai_addrlen
$5 = 16
(gdb) p result->ai_canonname
$6 = 0x0
(gdb) p result->ai_flags
$8 = 0
(gdb) p result->ai_protocol
$9 = 17
(gdb) p result->ai_socktype
$10 = 2
发布于 2012-01-28 06:26:24
未能为getaddrinfo
指定service
参数。试着这样调用getaddrinfo
:
int er = getaddrinfo(url, "9", &hints, &result);
或
int er = getaddrinfo(url, "discard", &hints, &result);
https://stackoverflow.com/questions/9039007
复制相似问题