Как использовать IP-адрес клиентов в функции, включенной в программу сервера?

Я написал программу сокетов. В моей серверной программе я включил функцию, называемую * data_process () *

Мой вопрос:

Серверная программа получает IP-адрес клиентов и записывает их в * info_agent_report.txt * файл.

Мне нужно использовать этот IP-адрес в * data_process () * программе * (который включен в серверную программу *), который создает файл * task_agent_report.csv *.

Могу ли я использовать его? (я использовал, но не отображал ip-адрес в * task_agent_report.csv * файле !!)

Может ли кто-нибудь помочь мне.

Моя программа 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:

 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)); } 

Ваша программа не в правильной структуре. вы получаете адрес клиента в переменной client_address в main () программе.

Затем вы вызываете data_process() , там вы снова просто объявляете переменную client_address и пытаетесь получить IP-адрес из этой локальной переменной, но эта локальная переменная не будет содержать никакой достоверной информации о клиенте.

Если вы хотите получить ip-адрес в функции data_processing() , вам нужно сделать объявление struct sockaddr_in client_address global или передать эту переменную в data_processing() .

Я думаю, вы пытаетесь отобразить данные пакета, такие как пакетный сниффер. использование может попробовать с RAW SOCKET, это упростит вашу работу. мужчина 7 сырой

Не уверен, чтобы понять вашу проблему, но почему бы вам не использовать значение в памяти вместо того, чтобы писать / читать его из файла?

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

С man-страницы char *, возвращаемый inet_ntoa , статически распределяется. Это означает, что есть статический указатель, удерживающий значение для вас. Это также означает, что значение на этом же адресе будет меняться каждый раз, когда вы вызываете inet_ntoa . Если вам почему-то нужно вызвать inet_ntoa пока вам все еще нужен указатель, скопируйте значение в другой буфер (как правило, с помощью strcpy и char [16])