我试图用原始套接字发送udp数据包。对于IPv4,一切正常,但我无法突破IPv6套接字的问题,其中sendto()始终表示无效参数。最初我在考虑IPv6的强制校验和,但IPV6_CHECKSUM选项应该解决这个问题,所以我现在没有选择。sendto()“无效参数”错误在Linux上的原始udp套接字
我使用inaddr_any作为addr_from,并且使用addr_to的一些ipv6地址与同一个端口。我通过send_ip工具来源查看,它手动计算校验和并发送带有原始/原始套接字的数据包,但我希望linux根据基于策略的路由规则自动形成具有必要源地址的IP数据包。
有没有人有任何想法这个问题的根源是什么?或者使用raw/ipproto_udp套接字的任何工作示例?
在此先感谢!
PS:请忽略所有线程的东西
发送代码:
typedef struct thread_data {
char msg[BUFFER_LENGTH];
struct sockaddr_in6 addr_to;
struct sockaddr_in6 addr_from;
} thread_data;
void create_packet(const thread_data* data, void** packet, size_t* size) {
size_t msg_len = strlen(data->msg), udp_len = sizeof(struct udphdr);
struct udphdr udp = {0};
udp.source = data->addr_from.sin6_port;