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

标签 c sockets

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

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

我可以执行 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/

相关文章:

c# - 如何通过套接字发送多条消息

c - 为什么比较具有未定义行为的指针仍会给出正确的结果?

c - C中的结构,它们有效吗?

c - 需要帮助编译一些东西! ( :

C: 空数组*

c - 保证在一次 send() 调用(tcp 套接字)中发送的数据的最小大小是多少?

python - Python套接字对象是线程安全的吗?

c++ - gethostbyaddr 错误未知主机

sockets - MFC CSocket keepalive数据包未发送

Python SocketServer.BaseRequestHandler 不会与远程请求通信