我正在为教育目的编写一个简单的服务器。简要程序示例:
// ...
unsigned int BUFSIZE = 0;
BUFSIZE -= 2;
// ...
int clientSocket;
// Создаём подключение
// ...
char *message = new char[BUFSIZE];
while (true)
{
long bytesNumber = 0;
bytesNumber = recv(clientSocket, message, BUFSIZE - 1, 0);
if (bytesNumber <= 0)
{
perror("recv");
break;
}
// ...
// Получаем ответ в ту же переменную message
// ...
bytesNumber = send(clientSocket, message, strlen(message) + 1, 0);
if (bytesNumber < 0)
{
perror("send");
break;
}
}
delete[] message;
message = 0;
当我向客户端发送小数据时,一切正常。当数据大小超过12510字节(selection接收),则send成功,后面的recv返回-1,对应connection reset by peer error。
请告诉我如何解决这个问题。
更新程序
我写了一个简单的客户端连接到这个服务器并在没有任何 HTTP 处理的情况下与它循环通信。接收或发送都没有问题。可能我对HTTP不是很了解。。。里面有什么限制或者特别之处吗?头条?
更新程序
一个有趣的情况。我通过在 Content-length 标头中传递一个比数据的实际大小大 1 的数字来解决这个问题。奇怪的是,为什么没有这个单元,小数据通常会被传输......
这个错误很愚蠢。
我在一个单独的应用程序中构建一个 HTTP 数据包,服务器通过管道与之通信。从管道接收到数据后,为了安全起见,我在消息末尾添加了一个行结束符。了解这一点后,我将消息传递给发送函数,指示长度比从管道接收到的消息长度多 1 个字节。一切都会好起来的,但只有这样才能将 HTTP 消息的内容增加 1 个字节。因此,我发送的 HTTP 数据包的内容长度明显大于标头中规定的长度。而且,据我了解,客户确实对来自此的数据感到“窒息”,因为它希望数据会更少。