gpt4 book ai didi

c - 套接字文件描述符自动更改

转载 作者:行者123 更新时间:2023-12-04 11:31:13 27 4
gpt4 key购买 nike

我尝试使用 RAW 套接字编程捕获所有接近我的 NIC 的 UDP 数据包。在这里我遇到了一个奇怪的问题。当我的程序运行时,我的套接字描述符会自动更改。这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/ip.h>
#include <netinet/udp.h>
#include <netinet/tcp.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>

int main () {

int sockfd = socket (PF_INET, SOCK_RAW, IPPROTO_UDP);
if (sockfd < 0) {
perror ("socket failed");
return -1;
}

char *buf = malloc (8192);
memset (buf, 0, 8192);
if (!buf) {
perror ("calloc failed\n");
return -1;
}

int ret_recv;
i:
while ((ret_recv = recv (sockfd, buf, 8192, 0)) > -1) {
printf ("%d\n", ret_recv);
struct iphdr *iph = (struct iphdr *) buf;
//struct udphdr *udph = (struct udphdr *) (buf + sizeof (struct iphdr));
struct tcphdr *tcph = (struct tcphdr *) (buf + sizeof (struct iphdr));
char ip[4];
printf ("source ip: %s\n", inet_ntop (AF_INET, &iph->saddr, ip, sizeof (struct sockaddr_in)));
printf ("dest ip: %s\n", inet_ntop (AF_INET, &iph->daddr, ip, sizeof (struct sockaddr_in)));
//printf ("port: %d\n", ntohs (udph->source));
printf ("port: %d\n", ntohs (tcph->source));
}
perror ("recv failed");
//goto i;
return 0;
}

在我的输出中,不是无限循环的数据包信息打印,而是只打印了一个信息包。所以我检查了gdb。我使用了 display sockfd。 socket 调用后,sockfd 的值为 7。然后在 while 循环内,执行 dest ip 的 printf 后,sockfd 值变为 808988216。因此 recv 失败并出现“错误的文件描述符”错误。我找不到到底出了什么问题。

提前致谢:-)

最佳答案

这是缓冲区溢出:

char ip[4];
printf ("source ip: %s\n", inet_ntop (AF_INET, &iph->saddr, ip, sizeof (struct sockaddr_in)));

缓冲区不够大,无法容纳 IP 地址的字符串形式。此外,第四个参数是关于可用空间的inet_ntop(),它应该是:

char ip[INET_ADDRSTRLEN];
printf ("source ip: %s\n", inet_ntop (AF_INET, &iph->saddr, ip, sizeof ip));

关于c - 套接字文件描述符自动更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10977276/

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