如何在服务器程序中包含的函数中使用客户端IP地址?

时间:2013-12-12 10:26:03

标签: c sockets

我编写了一个C套接字程序。在我的服务器程序中,我已经包含了一个名为* data_process()*

的函数

我的问题是

服务器程序获取客户端IP地址并写入* info_agent_report.txt *文件。

我需要在* data_process()*程序*(包含在服务器程序*中)中使用该ip地址,该程序会创建* task_agent_report.csv *文件。

我可以使用它吗? (我已经使用但它没有在* task_agent_report.csv *文件中显示ip地址!!)

有人可以帮助我。

我的server和data_process()程序如下

int main()
{
  //intialization
  //....
  struct sockaddr_in client_address;
  if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) > 0)
    address.sin_family = AF_INET;
  address.sin_addr.s_addr = inet_addr("127.0.0.1");
  address.sin_port = htons(9734);
  server_len = sizeof(address);
  bind(sockfd, (struct sockaddr *) &address, server_len);

  listen(sockfd, 5);
  while (1)
  {
    char ch;

    client_len = sizeof(client_address);

    new_sockfd = accept(sockfd, (struct sockaddr *) &client_address,
        &client_len);

    if (new_sockfd == -1)
    {
      perror("Connection Not Accepted!!");
      return (1);
    }
    else
    {
      printf("..");
      //to dispaly ip address
      FILE* ta_address = fopen("info_agent_report.txt", "a+");
      fprintf(ta_address, "%s,", inet_ntoa(client_address.sin_addr));
      fclose(ta_address);

      log = open("info_agent_report.txt", O_CREAT | O_RDWR | O_APPEND, 0777);
      if (log == -1)
      {
        perror("cannot open info_agent_report file\n");
        return (1);
      }

      do
      {
        x1 = read(new_sockfd, buffer1, 1024);
        x2 = write(log, buffer1, x1);
      } while (x1 > 0);
      close(log);
      close(new_sockfd);
    }

    data_process();
  }
}
//i need to use the ip address in this function

data_process program:

void ProcessPacket(unsigned char* , int);
void print_ip_header(unsigned char*, int);
void print_tcp_packet(unsigned char *, int);
void print_udp_packet(unsigned char *, int);
void print_icmp_packet(unsigned char*, int);
void PrintData(unsigned char*, int);

FILE *logfile;

int data_process()
{
  //intialising...   
  unsigned char *buffer3 = (unsigned char *) malloc(1024);

  //i tried to print the ip address on the terminal but it din't

  struct sockaddr_in client_address;
  printf("print on the terminal from info agent%s\n",
      inet_ntoa(client_address.sin_addr));

  infile = open("info_agent_report.txt", O_RDONLY);
  if (infile == -1)
  {
    perror("cannot open info_agent_report file\n");
    return (1);
  }

  logfile = fopen("task_agent_processed.csv", "w+");
  if (logfile == NULL)
  {
    printf("Unable to create task_agent_processed file.");
  }

  do
  {
    data_size = read(infile, buffer3, 1024);
    print_tcp_packet(buffer3, data_size);

  } while (data_size > 0);

  fclose(logfile);
  close(infile);
  return 0;
}

void print_tcp_packet(unsigned char* Buffer, int Size)
{
  //initialization,structure.... 

  //i need to use the ip address in the csv file to display it in the same row   

  fprintf(logfile, "%s,%d,%u\n", inet_ntoa(client_address.sin_addr), 1,
      ntohs(tcph->source));
}

2 个答案:

答案 0 :(得分:0)

不确定是否了解您的问题,但为什么不在内存中使用该值而不是从文件中写入/读取它?

char* ip_addr;
// ...
ip_addr = inet_ntoa(client_address.sin_addr);
// ...
data_process(ip_addr);

在手册页中,inet_ntoa返回的char *是静态分配的。这意味着有一个静态指针为您保存值。这也意味着每次调用inet_ntoa时,此地址的值都会更改。 如果您在需要指针时需要调用inet_ntoa,请将值复制到另一个缓冲区(通常使用strcpy和char [16])

答案 1 :(得分:0)

您的程序结构不正确。你正在获得客户地址 main()程序中的client_address变量。

然后你正在调用data_process()函数,在那里你再次声明client_address变量并尝试从该局部变量获取ip地址,但是这个局部变量不包含任何有关客户端的有效信息。 / p>

如果您想在data_processing()函数中获取IP地址,则必须将struct sockaddr_in client_address变量声明设为全局,否则将此变量传递给data_processing()

我认为您正在尝试显示数据包嗅探器等数据包详细信息。使用可以尝试RAW SOCKET这将使您的工作轻松。 man 7 raw