在C中读取客户端的所有行

在C中读取客户端的所有行,c,string,sockets,client,readline,C,String,Sockets,Client,Readline,我想读取和处理来自客户端的所有行,但似乎一次只读取一行。我以为在有读取数据的情况下有一个循环会读取所有数据,但事实似乎并非如此。 如果读取不完整,我将在下一步中在该索引处继续读取 我有这样的想法: if (select(maxfd + 1, &fdlist, NULL, NULL, NULL) < 0) { perror("select"); } else { if (FD_ISSET(listenfd, &fdlist)) { newcli

我想读取和处理来自客户端的所有行,但似乎一次只读取一行。我以为在有读取数据的情况下有一个循环会读取所有数据,但事实似乎并非如此。 如果读取不完整,我将在下一步中在该索引处继续读取

我有这样的想法:

if (select(maxfd + 1, &fdlist, NULL, NULL, NULL) < 0) {
    perror("select");
} else {
    if (FD_ISSET(listenfd, &fdlist)) {
        newclientconnection();
    }

    // see which clients have activity
    for (p = head; p; p = p->next) {
        if (FD_ISSET(p->fd, &fdlist)) {
            // want to read all lines from client
            while ((n = read(p->fd, p->buf + lastindex, MAX-p->lastindex) > 0) {
                p->lastindex += n;          
            }
            if (n==0) {
                removeclient(p);
            } 

            // want to process all the lines
            process(p->buf);
    } 
}

这行中有阻塞:

while ((n = read(p->fd, p->buf + lastindex, MAX-p->lastindex) > 0))
在最后一次迭代中,while cond。等待来自read的输入。但是输入已经被读取。所以,等待新的输入


若您假设您得到的数据大于缓冲区,所以将读取放入while条件,则需要为读取定义超时选择等或定义特殊符号\r\n\r\n,例如,以确定这是数据的结束。否则,while循环将永远等待更多数据。

或者使用O_NONBLOCK?使文件描述符不阻塞?@JonathanLeffler当然!有几个选择,这就是为什么我写等等。