在程序中用变量初始化 IP 和 PORT

Initializing IP and PORT with variables in program

我正在通过这个文本文件读取几个套接字的 IPS 和端口 IP_CONFIG.txt

"192.168.128.3" IP_CSR 
"192.168.128.2" IP_HMIR 
"192.168.128.1" IP_OBCUR 
"192.168.128.4" IP_ASRR 
"127.0.0.1" IP_RSOR 
"127.0.0.1" IP_RSO_DR
1901 PORT_CSR 
1901 PORT_HMIR
1901 PORT_OBCUR
3567 PORT_ASRR
4444 PORT_RSOR
7777 PORT_RSO_DR

我用下面的方式实现了代码..

1) 我用整数将所有不同的 IP 地址保存在不同的字符串和端口中。

2) 我在定义套接字地址时调用这些变量。

问题:虽然它在使用 printf 调用这些变量时给出了正确的值,但是我无法在定义不同系统的 IP 地址和端口时加载这些变量

完整代码在这里。

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> 
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#define MAX_DATE 100
# define BUFLEN 1024
#define ROW 11
#define COL 2
#define MAXWORDS 24

int main(int argc, char **argv)
{
  //Declared variables
  int sock, sock_RST; // socket name
  int bytes_read; // variable for recvfrom
  int addrlen;    // length of address
  int i = 0, j = 0, k = 0, z = 0;        // counters
  unsigned char ca[BUFLEN], last_OBCU_msg[BUFLEN], last_HMI_msg[BUFLEN],
      rcvd_ASR_msg[BUFLEN]; // Data buffers

  struct sockaddr_in server_addr, HMI_addr, OBCU_addr, ASR_addr, RSO_addr,
      test_addr; //addresses IP PORT
  struct sockaddr_in RSO_addr_d;
  const char yes = 1;
  int TAG_ASR = 0;

  // Create a lof file

  time_t now;
  char the_date[MAX_DATE];
  the_date[0] = '[=11=]';
  now = time(NULL );
  strftime(the_date, MAX_DATE, "CS_LOG_%H_%M_%d_%m_%Y" ".txt", gmtime(&now));
  chdir("/home/bsnayak/CS_LOG/");
  FILE *file = fopen(the_date, "a");

  //Read IPS and PORTS from a text file
  //char* file="C:\Documents and Settings\Supernovah\Desktop\Supernovah.bin";
  //FILE* pFile = fopen( file, "rb" );
  char* file_text = "/home/bsnayak/IP_CONFIG.txt";
  FILE *fp = fopen(file_text, "r");
  int ii = 0, jj;
  char *words = NULL, *word = NULL, c;
  char *allwords[MAXWORDS];

  while ((c = fgetc(fp)) != EOF)
  {
    ii++;
    if (c == '\n')
    {
      c = ' ';
    }
    words = (char *) realloc(words, (ii + 1) * sizeof(char));
    words[ii - 1] = c;

  }

  words[ii] = '[=11=]';
  word = strtok(words, " ");
  ii = 0;
  while (word != NULL && ii < MAXWORDS)
  {
    //printf("%s\n",word);
    allwords[ii] = malloc(strlen(word) + 1);
    strcpy(allwords[ii], word);
    word = strtok(NULL, " ");

    //allwords[ii][strlen(word)] = '[=11=]';
    ii++;
  }
  if (error_name)

    printf("\nNow printing each saved string:\n");
  /*for (jj=0; jj<ii; jj++){
   printf("String %d: %s\n", jj, allwords[jj]);
   //free(allwords[jj]);
   }*/
  char *IP_CS = allwords[0];
  char *IP_HMI = allwords[2];
  char *IP_OBCU = allwords[4];
  char *IP_ASR = allwords[6];
  char *IP_RSO = allwords[8];
  char *IP_RSO_D = allwords[10];

  int PORT_CS = atoi(allwords[12]);
  int PORT_HMI = atoi(allwords[14]);
  int PORT_OBCU = atoi(allwords[16]);
  int PORT_ASR = atoi(allwords[18]);
  int PORT_RSO = atoi(allwords[20]);
  int PORT_RSO_D = atoi(allwords[22]);
  //printf("The IPs are \n %s\n %s\n %s\n %s\n %s\n %s\n",IP_CS,IP_HMI,IP_OBCU,IP_ASR,IP_RSO,IP_RSO_D);
  //printf("The PORTSs are \n %d\n %d\n %d\n %d\n %d\n %d\n",PORT_CS,PORT_HMI,PORT_OBCU,PORT_ASR,PORT_RSO,PORT_RSO_D); 

  //free(allwords[MAXWORDS]);

  setbuf(stdout, NULL );
  addrlen = sizeof(struct sockaddr_in);

  // Create the Socket for all connections except RST
  if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
  {
    perror("Socket Creation Error");
    exit(1);
  }

  // Create the Socket for RST section
  if ((sock_RST = socket(PF_INET, SOCK_DGRAM, 0)) == -1)
  {
    perror("Socket Creation Error");
    exit(1);
  }

  // make CS socket non blocking and reusable
  fcntl(sock, F_SETFL, O_NONBLOCK);
  if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*) &yes, sizeof(int)) < 0)
  {
    perror("Reuse option\n");
    close(sock);
    exit(1);
  }

  // make RST socket non blocking and reusable
  fcntl(sock_RST, F_SETFL, O_NONBLOCK);
  if (setsockopt(sock_RST, SOL_SOCKET, SO_REUSEADDR, (char*) &yes, sizeof(int))
      < 0)
  {
    perror("Reuse option\n");
    close(sock_RST);
    exit(1);
  }

  printf("\nchecked1\n");
  // Control server properties
  bzero(&(server_addr.sin_zero), sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_port = htons(PORT_CS);
  server_addr.sin_addr.s_addr = inet_addr(IP_CS); //inet_addr("192.168.128.3"); //

  // HMI server properties 
  bzero(&(HMI_addr.sin_zero), sizeof(HMI_addr));
  HMI_addr.sin_family = AF_INET;
  HMI_addr.sin_port = htons(PORT_HMI);
  HMI_addr.sin_addr.s_addr = inet_addr(IP_HMI);

  // OBCU server properties
  bzero(&(OBCU_addr.sin_zero), sizeof(OBCU_addr));
  OBCU_addr.sin_family = AF_INET;
  OBCU_addr.sin_port = htons(PORT_OBCU);
  OBCU_addr.sin_addr.s_addr = inet_addr(IP_OBCU);

  // ASR Server properties

  bzero(&(ASR_addr.sin_zero), sizeof(ASR_addr));
  ASR_addr.sin_family = AF_INET;
  ASR_addr.sin_port = htons(PORT_ASR);
  ASR_addr.sin_addr.s_addr = inet_addr(IP_ASR);

  // RSO server properties

  bzero(&(RSO_addr.sin_zero), sizeof(RSO_addr));
  RSO_addr.sin_family = AF_INET;
  RSO_addr.sin_port = htons(PORT_RSO);
  RSO_addr.sin_addr.s_addr = inet_addr(IP_RSO);

  // RSO destination properties  (To which you send string content)

  bzero(&(RSO_addr_d.sin_zero), sizeof(RSO_addr_d));
  RSO_addr_d.sin_family = AF_INET;
  RSO_addr_d.sin_port = htons(PORT_RSO_D);
  RSO_addr_d.sin_addr.s_addr = inet_addr(IP_RSO_D);

  // BIND Controlserver to the main socket
  if (bind(sock, (struct sockaddr *) &server_addr, sizeof(struct sockaddr))
      != 0)
  {
    perror("Bind Error");
    close(sock);
    exit(1);
  }

  printf("checked2\n");

  // Bind RSO for second socket
  if (bind(sock_RST, (struct sockaddr *) &RSO_addr, sizeof(struct sockaddr))
      != 0)
  {
    perror("Bind Error");
    close(sock_RST);
    exit(1);
  }

  printf("checked3\n");

  while (1)
  {

    addrlen = sizeof(test_addr);
    bytes_read = recvfrom(sock, ca, BUFLEN, 0, (struct sockaddr *) &test_addr,
        &addrlen);
    //printf("checked4\n"); 
    if (test_addr.sin_addr.s_addr == OBCU_addr.sin_addr.s_addr)
    {
      sendto(sock, ca, bytes_read, 0, (struct sockaddr *) &HMI_addr,
          sizeof(HMI_addr));
      memcpy(last_OBCU_msg, ca, sizeof(ca));
      memset(ca, 0, BUFLEN);
      printf("OHS Received\n");
    }

  }

  fclose(file);
  return 0;
}

但是,如果我删除可变名称并手动分配 IP 和端口,它可以完美运行,但为什么不能将它们用作变量。请提出必要的修改,建议..

从文件中读取的 IP 地址用 " 符号括起来。

那是你没有将 "1.2.3.4" 传递给 inet_addr(),而是 "\"1.2.3.4\""。由于 "1.2.3.4" 不是有效的 IP 地址(1.2.3.4 会是),函数失败。

只需将它们打印出来或使用调试器检查它们就会向您展示这一点。