gpt4 book ai didi

c - 为什么我的TTL值每次都增加2? (C Socket编程)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:49 25 4
gpt4 key购买 nike

我正在尝试实现一个 Traceroute 程序,但我遇到了两个问题,一个是 TTL 和 RTT 打印错误;尽管它们在作为 ping 程序实现时打印正确。最后,我的主要问题是,当我增加 TTL 时,它会增加 2 而不是 1。

我只包含了我认为必要的代码,谢谢。

提前致谢:)

void
respond (int signum) {
struct sockaddr_storage peer_addr;
socklen_t peer_addrlen;
struct sockaddr_in addr;
struct sockaddr_in dstaddr;
struct iphdr * ip;
struct icmphdr * icmp;
struct timeval * sent;
int skt;
int sequence;
long int length;
fd_set rdfds;
int ready;
int rtt;
char buff [BUF_SIZE];

/* Create and check Socket Number */
skt = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP);


int ttl = 0;
setsockopt(skt, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)) < 0;


/* START SEND LOOP*/
int i;
for (i = 0; i < 4; i++){
ttl+=1;
setsockopt(skt, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));


/* Check Socket */
if (skt < 0) {
perror ("socket()");
exit (1);
}

/* Set IP Addresses */
addr.sin_family = AF_INET;
addr.sin_port = 0;
addr.sin_addr.s_addr = INADDR_ANY;


/* Check Socket Bind */
if (bind (skt, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))) {
perror ("Can't bind socket");
exit (1);
}

/* IP Buffer */
ip = (struct iphdr *)buff;
peer_addrlen = (socklen_t) sizeof (struct sockaddr_storage);
memset (&dstaddr, 0, sizeof(struct sockaddr_in));
dstaddr.sin_addr.s_addr = inet_addr(HOSTADDR);
dstaddr.sin_family = AF_INET;

ip->ttl=(ttl++);

/* ICMP Buffer */
memset (buff, 0, sizeof(buff));
icmp = (struct icmphdr *) buff;
icmp->type = ECHO_REQ;
icmp->id = htons(getpid( ) & 0xffff);
icmp->seqNum = htons(sequence++);


/* Check Send Time */
if (gettimeofday ((struct timeval *)icmp->data, NULL)) {
perror ("Can't establish send time");
exit (1);
}

/*Calculating packet size*/
length = sizeof(struct icmphdr) + sizeof(struct timeval);
icmp->checksum = ~(sum (0, buff, length));



/* Packet too small, ERROR
SEND Request */
if (sendto (skt, buff, length, 0,
(struct sockaddr *) &dstaddr, sizeof(struct sockaddr_in)) <= 0) {
perror ("sendto()");
exit (1);
}

/* Define File Descriptor */
timeout.tv_sec = 2;
timeout.tv_usec = 0;
FD_ZERO(&rdfds);
FD_SET (skt, &rdfds);

/* Select Data from File Descriptor */
ready = select (skt + 1, &rdfds, NULL, NULL, &timeout);
if (ready < 0) {
perror ("Select()");
exit (1);
}

/* Recieve Reply */
memset (buff, 0, sizeof(buff));
if (recvfrom (skt, buff, sizeof(buff), 0,
(struct sockaddr *) &peer_addr, &peer_addrlen) <= 0) exit (1);



/* Check Time Stamp */
if (gettimeofday (&end, NULL)) { // Timestamp reception
perror ("Can't establish time of receipt");
exit (1);
}


/* Check IP Protocol */
if (ip->version != 4 ||
sum (0, buff, sizeof(struct iphdr)) != 0xffff ||
ip->protocol != ICMP)
exit(1);


/* Get IP Payload legth and ICMP Address*/
length = ntohs(ip->length) - ip->hdrlen * 4; // Length of IP payload
icmp = (struct icmphdr *)((uint32_t *)ip + ip->hdrlen); // Find ICMP hdr


/* Check ICMP response type*/
if (icmp->type == 11){
printf("Type 11: ICMP....");
}

/* if (icmp->type != ECHO_REPL || sum (0, icmp, length) != 0xffff) {
fprintf (stderr, "Received %s\n", messages[icmp->type]);
//exit (1);
} */

/* Find the difference between sent and end times in 10s of ms */
sent = (struct timeval *)icmp->data;
if ((rtt = (end.tv_usec - sent->tv_usec) / 100) < 0)
rtt += 10000; // We've cycled to a new second
rtt += (end.tv_sec - sent->tv_sec) * 10000; // Add any seconds

/* PRINT ICMP REPLY*/
printf ("%ld bytes from %s: icmp_req=%d ttl=%d time=%0.1f ms\n",
length,
iptos(ntohl(ip->srcip)),
ntohs(icmp->seqNum),
/*Set initial TTL */
ip->ttl,
((float)rtt) / 10);


} /*END SEND LOOP

/* Invalid Signal returned */
if (signum == SIGINT) {
printf ("\nGoodbye!\n");
exit(0);
}

/* 3 Second Probe */
alarm (3);
}

最佳答案

/* START SEND LOOP*/
int i;
for (i = 0; i < 4; i++){
ttl+=1;
setsockopt(skt, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));

在这里,每次循环迭代时,您将 ttl 增加 1。

 ip->ttl=(ttl++);

在这里你又增加了一个。因此,如果它是 1,则此行之后将是 2。然而,一旦循环迭代,您再次增加它,所以它现在是 3。这就是为什么您的 ttl 在每次迭代中增加 2 的原因。

ip->ttl=(ttl++)这一行的意思是:取ttl的值,复制到ip->ttl,然后在这样做之后,将 ttl 增加一。

关于c - 为什么我的TTL值每次都增加2? (C Socket编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14762825/

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