gpt4 book ai didi

c - 找出与 sendto 函数中使用的套接字关联的 src IP 和端口

转载 作者:行者123 更新时间:2023-12-03 09:51:06 24 4
gpt4 key购买 nike

在下面的函数中,在我使用 sendto() 之后,我想知道用于发送消息的源 IP 和端口。有可能查出来吗?

void sendMsg(char* payload, size_t payloadLength, const char* ip6Addr, short port)
{
int sock;
size_t size;
socklen_t clilen;
struct sockaddr_in6 server_addr, client_addr;

sock = socket(PF_INET6, SOCK_DGRAM, 0);

if (sock < 0) {
perror("creating socket");
exit(1);
}

memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin6_family = AF_INET6;
inet_pton(AF_INET6, ip6Addr, &server_addr.sin6_addr);
server_addr.sin6_port = htons(port);

size = sendto(sock, payload, payloadLength, 0 , (const struct sockaddr *) &server_addr,sizeof(server_addr));
if(size < 0)
printf("Error in sending message\n");
else
printf("[%d] bytes written to network\n",size);
}

最佳答案

这是获取端口的方法。绑定(bind)到 INADDR_ANY 地址 (IN6ADDR_ANY_INIT)。然后使用getsockname。

sockaddr_in6 addr = {0};
sockaddr_in6 addrLocal = {0};
socklen_t addrSize = sizeof(addrLocal);
unsigned short port = 0;

addr.sin6_family = AF_INET6;
sock = socket(AF_INET6, SOCK_DGRAM,0);
bind(sock, (sockaddr*)&addr, sizeof(addr)); // bind to the INADDR_ANY address for IPV6

getsockname(sock, (sockaddr*)&addrLocal, &addrSize);

port = addrLocal.sin6_port;

我不确定 IP 地址。 addrLocal 中嵌入的 IP 地址仍将全为零。不确定您如何获得用于特定数据包发送的 IP 地址。最坏的情况是,您枚举路由表以推断哪个接口(interface)和地址最有可能用于特定目标 IP。

关于c - 找出与 sendto 函数中使用的套接字关联的 src IP 和端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61201543/

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