gpt4 book ai didi

C - 大约 30 次读取后无法读取套接字

转载 作者:行者123 更新时间:2023-11-30 15:23:14 25 4
gpt4 key购买 nike

所以我有两个进程,一个客户端进程,一个服务器进程。用户可以向客户端发出命令,当用户输入命令时客户端会将命令长度发送给服务器,之后再发送实际的命令。

服务器首先发回响应的长度,然后发送回响应。

我可以执行 5-30 个命令左右,完全没有问题,但在某些时候,尽管收到了正确的响应大小,但它无法读取足够的字节。

服务器通过以下方式发送响应:

 str[0] = '\0';
unsigned long int totalSize = 0;
while ((fgets(outBuf, MAXOUTPUT, myFile)) != NULL)
{
strcat(str, outBuf);
}
uint32_t *un = 0;
totalSize = strlen(str);
*un = htonl(totalSize);
result= send(clientFD, un, sizeof(uint32_t), 0);
if(result < 1)
{
printf("Failed sending message size to client");
exit(-1);
}
while(token != NULL)
{
size_t length = strlen(token);
token[length] = '\n';
write(clientFD, token, length + 1);
token = strtok(NULL, "\n");
}

客户端已正确接收消息长度(通过打印验证)并以这种方式读取响应:

result = read(socketFD, recvBuf, bufferlen); //bufferlen is response size
if(result < bufferlen)
{
perror("read()");
exit(-1);
}

我已经验证客户端每次都收到正确的消息长度,包括最后一次读取失败的消息。

所以我的问题是:我的阅读有时无法检索完整响应的可能原因是什么?通常在执行大约 5-30 个命令后会发生这种情况,并且返回的 perror 是错误 0(也称为找不到错误)。

作为补充说明,测试的命令是

ls -la,ls -l,ls。我还没有找到命令导致崩溃的模式,但我已经将它们组合了很多。

此外:客户端和服务器都是 32 位,并且在本地同一台计算机上运行。

最佳答案

read()(尤其是在套接字上)一旦一些数据可用就返回,它可能总是返回比您要求的个字节为了。在这种情况下,您需要重复读取,直到读取足够的数据:

size_t bytes_read = 0;
while (bytes_read < bufferlen) {
result = read(socketFD, recvBuf + bytes_read, bufferlen - bytes_read);
if (result < 0) {
perror("read()");
exit(-1);
}
bytes_read += result;
}

关于C - 大约 30 次读取后无法读取套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28908037/

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