C套接字,recv丢失数据

问题描述 投票:-2回答:1

我做了一个TCP客户端/服务器,我想发送请求,但recv函数丢失数据(发送缓冲区的第3个字节)

我尝试了很多东西:

-put printf无处不在

- 更改端口号

- 改变/优化我的代码

- 使用wireshark

-use循环标记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;
}

我想发送“GET主机列表”,我收到“主机列表”。

c sockets send recv
1个回答
2
投票

看起来你发送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
© www.soinside.com 2019 - 2024. All rights reserved.