Неблокирующая розетка - PullRequest
1 голос
/ 06 октября 2009

Неблокирующий сокет - это тот, где мы вызываем метод fcntl () и ассоциируем с ним флаг O_NONBLOCK. Кто-нибудь может сказать мне, что еще требуется для преобразования обычного сокета TCP_IP в неблокирующий сокет?

Какие проблемы могут возникнуть, если неблокирующие сокеты очень хорошо работают с серверами Windows?

1 Ответ

8 голосов
/ 06 октября 2009

Пример init для linux может выглядеть так:

int flags;
s = socket(PF_INET, SOCK_STREAM, IPPROTO_IP) // ret 5
setsockopt(s, SOL_TCP, TCP_NODELAY, [1], 4) 
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, [1], 4) 
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, [1], 4) 
flags = fcntl(s,F_GETFL,0);
assert(flags != -1);
fcntl(s, F_SETFL, flags | O_NONBLOCK);
connect(s, {sa_family=AF_INET, sin_port=htons(5001), sin_addr=inet_addr("192.168.0.68")}, 16)

Основная белая бумага от солнца:

солнце асыч нетто

В Windows Вы используете перекрывающиеся сокеты ввода-вывода, чтобы получить не блокирующую сеть.

Посмотрите здесь и в MSDN, как писать код с ПЕРЕКРЫТЫМИ структурами

В Linux используйте epoll ().

На разъеме Solaris ().

Будьте внимательны, чтобы читать или писать в сокет, когда он не готов. (выберите-выход) Потому что вы можете получить ошибку EAGAIN.

Отличная кроссплатформенная библиотека (кроме C ++ и нового стандартного кандидата на c ++) является boost :: asio.

Используются собственные системные асинхронные методы.

повышение :: ASIO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...