通过网络流发送IP地址后更改

时间:2015-03-26 19:52:00

标签: c networking

我正在创建一个临时查询协议,需要通过网络发送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);
      }
}

0 个答案:

没有答案