С сокет, recv потерять данные - PullRequest
0 голосов
/ 25 марта 2019

Я сделал TCP клиент / сервер, и я хочу отправить запрос, но функция recv теряет данные (3-е первые байты отправленного буфера)

Я много чего перепробовал:

-печать printf везде

- изменить номер порта

- изменить / оптимизировать мой код

- использовать проволочную акулу

-используются флаги MSG_WAITALL и MSG_PEEK в цикле, в то время как размер получаемых байтов отличается от размера буфера, отправляемого ранее (и я видел, что буфер, хранящийся в сокете, обрезан, поэтому я теряю байты между send () и recv () ?)

-Может быть и другие вещи, но я не помню.

int send_net(SOCKET socket, const char *buffer)
{
    if (send(socket, ft_itoa(strlen(buffer) + 1), strlen(ft_itoa(strlen(buffer))) + 1, 0) == -1)
    {
        perror("send size");
        return -1;
    }
    if (send(socket, buffer, strlen(buffer) + 1, 0) == -1)
    {
        perror("send buffer");
        return -1;
    }
    return 0;
}
char    *recv_net(SOCKET socket)
{
    unsigned int size;
    char *buffer = NULL;
    int bytes;

    buffer = calloc(6, sizeof(char));

    if ((bytes = recv(socket, buffer, 6, MSG_WAITALL)) == -1)
    {
        perror("recv size");
        return NULL;
    }

    size = atoi(buffer);
    buffer = realloc(buffer, sizeof(char) * size);
    bzero(buffer, size);

    if ((bytes = recv(socket, buffer, sizeof(char) * size, MSG_WAITALL)) != -1)
    {
        perror("recv buffer");
        return NULL;
       }
    return buffer;
}

Я хочу отправить «Список хостов» и получаю «Список хостов».

1 Ответ

2 голосов
/ 25 марта 2019

Похоже, вы отправляете 14\0GET Host List\0. Основная проблема заключается в том, что вы прочитали 6 байтов для размера сообщения независимо от того, сколько байтов отправлено. Поскольку вы отправляете \0, вы можете использовать его, чтобы узнать, когда прекратить чтение:

buffer = calloc(6, sizeof(char));
int index = 0;
char c;

do {
    // Read a single byte
    bytes = recv(socket, &c, 1, MSG_WAITALL);
    // Check for error
    if (-1 == bytes) {
        perror("recv size");
        return NULL;
    }
    // Append to buffer
    buffer[index++] = c;
    // TODO: realloc if more than 5 digits    
} while (c != 0);

// Now buffer should contain a null-terminated string of digits
...