C套接字,recv丢失数据
C socket, recv lose data
我创建了一个 TCP client/server,我想发送请求,但是 recv 函数丢失数据(缓冲区的第 3 个第一个字节已发送)
我尝试了很多东西:
-到处放printf
-更改端口号
-change/optimized我的代码
-使用wireshark
-在循环中使用标志 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 Host List",我收到“主机列表”。
您似乎要发送 14[=11=]GET Host List[=11=]
。主要问题是无论发送多少字节,您都读取消息大小的 6 个字节。由于您发送的是 [=12=]
,因此您可以使用它来了解何时停止阅读:
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
我创建了一个 TCP client/server,我想发送请求,但是 recv 函数丢失数据(缓冲区的第 3 个第一个字节已发送)
我尝试了很多东西:
-到处放printf
-更改端口号
-change/optimized我的代码
-使用wireshark
-在循环中使用标志 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 Host List",我收到“主机列表”。
您似乎要发送 14[=11=]GET Host List[=11=]
。主要问题是无论发送多少字节,您都读取消息大小的 6 个字节。由于您发送的是 [=12=]
,因此您可以使用它来了解何时停止阅读:
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