gpt4 book ai didi

c - 为什么对 sendto() 的调用失败了?

转载 作者:太空宇宙 更新时间:2023-11-04 09:52:56 24 4
gpt4 key购买 nike

我正在尝试发送具有特定负载的单个 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

最佳答案

您未能为 getaddrinfo 指定 service 参数。尝试这样调用 getaddrinfo:

int er = getaddrinfo(url, "9", &hints, &result);

int er = getaddrinfo(url, "discard", &hints, &result);

关于c - 为什么对 sendto() 的调用失败了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9039007/

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