gpt4 book ai didi

C套接字,recv丢失数据

转载 作者:行者123 更新时间:2023-11-30 20:08:49 25 4
gpt4 key购买 nike

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

我尝试了很多事情:

-将 printf 放在任何地方

-更改端口号

-更改/优化我的代码

-使用wireshark

- 在循环中使用标志 MSG_WAITALL 和 MSG_PEEK,而接收的字节大小与之前发送的缓冲区大小不同(并且我已经看到套接字中存储的缓冲区被剪切,因此我在 send() 和 receive() 之间丢失了字节?)

-也许还有其他事情,但我不记得了。

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 Host List”并且收到“Host List”。

最佳答案

看起来您正在发送 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

关于C套接字,recv丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55344228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com