Доступ к памяти и изменение значения некоторых переменных - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь установить связь между одним сервером и множеством клиентов. Сервер запускается и ждет подключения клиента. Мне удается одновременно открыть несколько сокетов через select. Когда я передаю некоторую информацию от клиента к серверу и последругому клиенту переменная, которая хранится, например, IP-адрес клиента (в типе char *) меняется на переменную, которую я только что прочитал

struct sockaddr_in address;
address.sin_family = AF_INET;

address.sin_addr.s_addr = inet_addr(clientIP);
address.sin_port = htons(clientport);


int addrlen = sizeof(address);
if (bind(master_socket, (struct sockaddr *)&address, sizeof(address))<0){   
    perror("bind failed");   
    exit(EXIT_FAILURE);   
}   
printf("Listener on port %d \n", serverport);

if (listen(master_socket, 3) < 0){   
    perror("listen");   
    exit(EXIT_FAILURE);   
}

 while(1){
    FD_ZERO(&readfds);
    FD_SET(master_socket, &readfds);   
    max_sd = master_socket;
    for( i = 0 ; i < max_clients ; i++){   
        sd = client_socket[i];   
        if(sd > 0)   
            FD_SET( sd , &readfds);   
        if(sd > max_sd)   
            max_sd = sd;   
    }
    activity = select( max_sd + 1 , &readfds , NULL , NULL ,NULL);

    if (FD_ISSET(master_socket, &readfds)){
        if ((new_socket = accept(master_socket,(struct sockaddr *)&address, (socklen_t*)&addrlen))<0){   
            perror("accept");
            exit(EXIT_FAILURE);
        }
        for (i = 0; i < max_clients; i++){   
            //if position is empty  
            if( client_socket[i] == 0 ){   
                client_socket[i] = new_socket;   
                printf("Adding to list of sockets as %d\n" , i);
                break;   
            }   
        }


        //inform user of socket number - used in send and receive commands


        //printf("New connection , socket fd is %d , ip is : %s , port : %d\n" , new_socket , inet_ntoa(address.sin_addr) , address.sin_port);  
        read(new_socket, buf, 1000);


 //LAST PART
 struct in_addr ip;
 ip.s_addr=clip;
 clientip=inet_ntoa(ip);//convert the integer IP to string(like 0.0.0.0)

Когда мой код достигает последней части, чтобы я мог преобразоватьIP в строку неожиданно происходит, например, у меня есть указатель для моего clientIP (char * clientIP), равный 195.134.65.92, и новый клиент с IP 195.134.65.95 внезапно меняет мой clientIP со своим значением. Я пыталсявсе, но ничего не помогает. Я использовал миллионы printfs до сих пор ничего.

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Ссылка inet_ntoa () документация

, в котором говорится, что «функция inet_ntoa () преобразует адрес хоста в Интернете, заданный в порядке сетевых байтов, в строку в десятичном формате с точками IPv4. Строка возвращается в статически выделенном буфере , которые последующие вызовы будут перезаписывать . "

Итак, чтобы сохранить IP-адреса клиента, просто скопируйте 'clientip' в другой буфер

Надеюсь, это поможет

0 голосов
/ 03 июня 2019

У меня есть подозрения: попробуйте пожалуйста "глубокую копию": memcpy(ip.s_addr,clip,sizeof(clip)); вместо ip.s_addr=clip; `

попробуйте инициализировать другие поля структуры:

ip.sin_family = AF_INET; 
    ip.sin_addr.s_addr = clip; 
    ip.sin_port = htons( PORT );

и распечатайте клип и убедитесь, что он находится на хосте или в сети с преобразованием в байты (большой или маленький индийский)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...