Функция сокета recv не возвращает обновленное значение

Попытка создания приложения для сокетов с использованием c (Linux) для постоянного извлечения данных с сервера. Для этого я создал цикл, в котором подпрограмма соединяется, отправляет команду, получает некоторые данные и закрывает сокет. Он отлично работает для первого взаимодействия, но выглядит как функция recv, которая не обновляет буферную переменную со второй итерации и другие.

Пытался использовать memset функция, чтобы очистить, но это очищает переменную, и она всегда остается пустой после первой итерации

Есть идеи?

Вот пример кода, который я использую

#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h> 
#include <string.h>

int main(int argc , char *argv[])
{
    char *message , server_reply[2000];
    struct sockaddr_in server;  
    int socket_desc;
    socket_desc = socket(AF_INET , SOCK_STREAM , 0);

    if (socket_desc == -1)
    {
        printf("Could not create socket");
    }

    server.sin_addr.s_addr = inet_addr("192.168.1.10");
    server.sin_family = AF_INET;
    server.sin_port = htons( 23 );

    int count = 0;
    for (;;)
    {
        printf("\nContador >> %i\n", count);
        count++;  
        connect(socket_desc , (struct sockaddr *)&server , sizeof(server));
        send(socket_desc , "command\r" , 2 , 0); 
        sleep(5);

//Receive a reply from the server
        recv(socket_desc, server_reply , 100 , 0);
        printf(server_reply); /// This always shows the same values as the first iteraction 
        sleep(10);
        close(socket_desc);
    }
    return 0;
}

1 ответ

Решение

Вы закрыли сокет в конце первой итерации. После этого, socket_desc больше не является допустимым файловым дескриптором.

Если вы действительно хотите новое соединение каждый раз, самое простое решение - поставить

socket_desc = socket(AF_INET , SOCK_STREAM , 0);

внутри вашей петли.

Как уже говорили другие: пожалуйста, проверьте возвращаемые значения, будьте готовы обработать случаи, когда не все ответы были получены за один раз, и исправьте вызов printf! То, что этот код работал один раз, не делает его правильным.

Другие вопросы по тегам