目录
accept函数
client = accept(listenFD, (struct sockaddr*)&cli, &len);
这里假设监听套接字是非阻塞的(NONBLOCK),边缘触发(ET)的,并且把监听套接字加入到了epoll里面。当监听套接字上面同时有多个连接排队的话,上面的代码只会接受队里里面的第一个client。所以需要循环把队列里面的client全部取出来。
while ((client = accept(listenFD, (struct sockaddr*)&cli, &len)) > 0) {
//do_some_thing
}
if (client < 0 && errno != EAGAIN) {
// handle error.
}
读取套接字里面的所有数据
n = read(events[i].data.fd, buf, sizeof(buf);
如果buf太小,socket缓冲区里面的数据字节数大于buf长度,那么上面的代码只会读取socket缓冲区里面的sizeof(buf)字节大小的数据,后面的数据是取不到的,只能等待到下一次该socket再有数据进来才能继续读取后面的sizeof(buf)字节的数据。所以还是需要循环把数据读完才行。
while((n = read([event[i].data.fd, buf, sizeof(buf))) > 0) {
//handle the buf
}
if (n < 0 && errno != EAGAIN) {
//handel error.
}
EAGAIN & EWOULDBLOCK
这两个常量好像在不同的系统下面会有区别,在Linux下面,这两个值是相等的,我现在还没有用到这两个值不同的系统。