在程序中用变量初始化 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
会是),函数失败。
只需将它们打印出来或使用调试器检查它们就会向您展示这一点。
我正在通过这个文本文件读取几个套接字的 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
会是),函数失败。
只需将它们打印出来或使用调试器检查它们就会向您展示这一点。