Вы дезинформированы о том, что fcntl()
не всегда надежен. Это неправда.
Чтобы пометить сокет как неблокирующий код, достаточно просто:
// where socketfd is the socket you want to make non-blocking
int status = fcntl(socketfd, F_SETFL, fcntl(socketfd, F_GETFL, 0) | O_NONBLOCK);
if (status == -1){
perror("calling fcntl");
// handle the error. By the way, I've never seen fcntl fail in this way
}
В Linux на ядрах> 2.6.27 вы также можете с самого начала создавать неблокируемые сокеты, используя socket()
и accept4()
.
например.
// client side
int socketfd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
// server side - see man page for accept4 under linux
int socketfd = accept4( ... , SOCK_NONBLOCK);
Это экономит немного работы, но менее переносимо, поэтому я склонен устанавливать его с fcntl()
.