我编写了一个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));
}
答案 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