Код: Выделить всё
client_socket = accept(_socket, (sockaddr *)&client_addr, &len)
Код: Выделить всё
fd_set readfds;
fd_set writefds;
//zero them
FD_ZERO(readfds);
FD_ZERO(writefds);
//set the client_socket
FD_SET(client_socket, &readfds);
FD_SET(client_socket, &writefds);
Код: Выделить всё
select(FD_SETSIZE, &readfs, &writefds, NULL, NULL)
Код: Выделить всё
if (FD_ISSET(client_socket, &readfds) {
read(client_socket, &buf, 4096);
}
//assume that buf is big enough and that read returns less than 4096
Теперь select позволит нам записать наш ответ клиенту:
Код: Выделить всё
if (FD_ISSET(client_socket, &readfds) {
write(client_socket, &buf, len(buf));
}
Предположим, что наш клиент сказал нам поддерживать соединение,
в этом случае мы бы установили fd_set так же, как и раньше:
Код: Выделить всё
//zero them
FD_ZERO(readfds);
FD_ZERO(writefds);
//set the client_socket
FD_SET(client_socket, &readfds);
FD_SET(client_socket, &writefds);
// reading not allowed
НО, если мы изменим настройку writefds на ноль, это will позволит нам читать, хотя мы ничего не меняли в readfds.
Код: Выделить всё
//zero them
FD_ZERO(readfds);
FD_ZERO(writefds);
//set the client_socket
FD_SET(client_socket, &readfds);
//FD_SET(client_socket, &writefds); -> don't set the file-descriptors for write
// now reading is allowed
/>Мне кажется, что поведение select является случайным при установке обоих наборов (запись и чтение).
Я знаю, что есть способ обойти это, сохраняя своего рода состояние, чтобы решить, хотим ли мы установить чтение файловых дескрипторов или запись файловых дескрипторов, но я надеялся на более чистое решение.
Подробнее здесь: https://stackoverflow.com/questions/714 ... te-sockets
Мобильная версия