Я пытаюсь отправить один пакет 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