在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当然!有几个选择,这就是为什么我写等等。