C-套接字TCP-带读取的无限循环

C-套接字TCP-带读取的无限循环,c,sockets,loops,tcp,C,Sockets,Loops,Tcp,当我想连续两次执行read函数Address来检索服务器发送的所有数据时,我遇到了一个问题 我读了一次,然后创建了一个无限循环 代码: char buff[50] = {0}; nbytes = 1; while (nbytes > 0) { nbytes = read(m_socket, buff, sizeof(buff)); } 为什么要创建无限循环?这不是“当”的问题

当我想连续两次执行read函数Address来检索服务器发送的所有数据时,我遇到了一个问题

我读了一次,然后创建了一个无限循环

代码:

        char   buff[50] = {0};

        nbytes = 1;
        while (nbytes > 0)
        {
            nbytes = read(m_socket, buff, sizeof(buff));
        }

为什么要创建无限循环?这不是“当”的问题

谢谢您的回答。

socket(2)
为您提供了一个阻塞文件描述符,这意味着像
read(2)
这样的系统调用会阻塞,直到有足够的数据来满足您的请求,或者发生流结束(对于TCP)(返回值
0
),或者发生错误(返回值
-1

这意味着您永远不会退出
while
循环,直到您遇到错误或对方关闭连接

编辑0:
@感谢EJP在这里像往常一样纠正我-
read(2)
阻塞,直到任何数据可用为止(不是您要求的全部内容,如我最初所述),包括流结束或错误。

nbytes的类型是什么?套接字是正常的阻塞套接字吗?是的,我读到了,你看到我的代码中有错误吗?m_socket变量是使用socket()函数read必须返回0初始化的正确描述符,但循环在函数read中。没有,虽然这是无限感谢你的回答。为什么我要写两次连续读取(m_socket,buff,sizeof(buff));第二次读取创建了一个无限循环?n字节永远不是0或-1。因为第一次读取时,您有50个字节可供读取,而第二次读取时,您可能没有,因此读取阻塞。您没有读取(或不理解)我说的内容。找一本关于套接字编程的书,或者找一本在线教程。你错过了最基本的东西。首先学习它们。只有当另一端完全关闭连接时,才会从
read
返回
0
值。