我正在创建一个临时查询协议,需要通过网络发送IP地址。 IP地址存储在具有其他信息的结构中,然后通过网络发送结构。问题是IP地址"变化"通过网络发送后。
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Query {
int TTL;
int pointer;
int reverse;
struct sockaddr_in destination;
struct sockaddr_in path[];
};
int main() {
int fd;
char routerAddr[INET_ADDRSTRLEN], neighbourAddr[INET_ADDRSTRLEN];
struct sockaddr_in address;
bzero((char *)&address, sizeof(struct sockaddr_in));
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("10.1.5.34");
address.sin_port = htons(50000);
struct Query q;
q.TTL = 5;
q.reverse = 0;
q.pointer = 0;
q.path[q.pointer] = address;
q.destination.sin_addr.s_addr = inet_addr("255.255.255.255");
q.pointer++;
char routerBuf[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(q.path[0].sin_addr), routerBuf, INET_ADDRSTRLEN);
printf("1[%s][%d]\n", routerBuf, q.pointer);
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
fprintf(stderr, "Error creating sending socket.\nExiting.\n");
exit(-1);
}
if (bind(fd, (struct sockaddr *)&address, sizeof(address)) == -1) {
fprintf(stderr, "Error binding to socket.\nExiting.\n");
perror("");
exit(-1);
}
struct sockaddr_in n;
memset((char *)&n, 0, sizeof(n));
n.sin_family = AF_INET;
n.sin_port = htons(50001);
n.sin_addr.s_addr = inet_addr("10.1.5.49");
if (sendto(fd, &q, sizeof(struct Query), 0, (struct sockaddr *)&n, sizeof(n)) == -1) {
fprintf(stderr, "Error sending to neighbhour.\nExiting.\n");
perror("");
exit(-1);
}
}
接收器类似,它使用recvfrom并将其接收的内容存储在结构中。打印出IP地址会产生不同的IP地址。 10.1.5.34 - &gt; 2.0.195.81
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Query {
int TTL;
int pointer;
int reverse;
struct sockaddr_in destination;
struct sockaddr_in path[];
};
int main() {
int fd, sd;
char routerAddr[INET_ADDRSTRLEN], neighbourAddr[INET_ADDRSTRLEN];
struct sockaddr_in address, neighbourAddress, r;
socklen_t addrlen = sizeof(neighbourAddress);
if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
fprintf(stderr, "Error creating sending socket.\nExiting.\n");
exit(-1);
}
bzero((char *)&r, sizeof(struct sockaddr_in));
r.sin_family = AF_INET;
r.sin_addr.s_addr = inet_addr("10.1.5.49");
r.sin_port = htons(50001);
if (bind(sd, (struct sockaddr *)&r, sizeof(r)) == -1) {
fprintf(stderr, "Error binding to socket.\nExiting.\n");
perror("");
exit(-1);
}
struct Query queryR;
int len = recvfrom(sd, &queryR, sizeof(struct Query), 0, (struct sockaddr *)&neighbourAddress, &addrlen);
char routerBuf[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(queryR.path[0].sin_addr), routerBuf, INET_ADDRSTRLEN);
printf("1[%s][%d]\n", routerBuf, queryR.pointer);
bzero((char *)&address, sizeof(struct sockaddr_in));
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("10.1.5.49");
address.sin_port = htons(50000);
struct Query q;
q.TTL = 5;
q.reverse = 0;
q.pointer = 0;
q.path[q.pointer] = address;
q.destination.sin_addr.s_addr = inet_addr("255.255.255.255");
q.pointer++;
inet_ntop(AF_INET, &(q.path[0].sin_addr), routerBuf, INET_ADDRSTRLEN);
printf("1[%s][%d]\n", routerBuf, q.pointer);
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
fprintf(stderr, "Error creating sending socket.\nExiting.\n");
exit(-1);
}
if (bind(fd, (struct sockaddr *)&address, sizeof(address)) == -1) {
fprintf(stderr, "Error binding to socket.\nExiting.\n");
perror("");
exit(-1);
}
struct sockaddr_in n;
memset((char *)&n, 0, sizeof(n));
n.sin_family = AF_INET;
n.sin_port = htons(50001);
n.sin_addr.s_addr = inet_addr("10.1.5.49");
if (sendto(fd, &q, sizeof(struct Query), 0, (struct sockaddr *)&n, sizeof(n)) == -1) {
fprintf(stderr, "Error sending to neighbhour.\nExiting.\n");
perror("");
exit(-1);
}
}