Что бы программа поняла, что к ней пытаются коннектится клиенты — надо вызвать
функцию accept(...) — которая блокируется, до тех пор, пока не придёт требование
клиена к подключению (функция клиетна connect(...) )
А как сделать так, чтобы програма не тормозила, на accept(...), а продолжала
дальше работать?? То есть нужен неблокирующий аналог accept(...)!!
1) Есть ли такая функция??
2) Может accept(...) вообще не нужен, и можно (после вызовов функций bind() и listeт())
функцией ioctlsocket() проверять есть ли данные???
3)может как-то иначе решить проблему ???
Здравствуйте grom_rom, Вы писали:
GR>Что бы программа поняла, что к ней пытаются коннектится клиенты — надо вызвать GR>функцию accept(...) — которая блокируется, до тех пор, пока не придёт требование GR>клиена к подключению (функция клиетна connect(...) )
GR>А как сделать так, чтобы програма не тормозила, на accept(...), а продолжала GR>дальше работать?? То есть нужен неблокирующий аналог accept(...)!!
Так ты серверный сокет сделай неблокирующим, и accept вместо того, чтобы блокироваться будет
WSAEWOULDBLOCK возвращать.
Здравствуйте grom_rom, Вы писали:
GR>Коллеги! GR>есть следующая проблема:
GR>Что бы программа поняла, что к ней пытаются коннектится клиенты — надо вызвать GR>функцию accept(...) — которая блокируется, до тех пор, пока не придёт требование GR>клиена к подключению (функция клиетна connect(...) )
GR>А как сделать так, чтобы програма не тормозила, на accept(...), а продолжала GR>дальше работать?? То есть нужен неблокирующий аналог accept(...)!!
GR>1) Есть ли такая функция?? GR>2) Может accept(...) вообще не нужен, и можно (после вызовов функций bind() и listeт()) GR> функцией ioctlsocket() проверять есть ли данные??? GR>3)может как-то иначе решить проблему ???
GR>Заранее благодарен
Я выносил accept() и сопутствующее в отдельный thread
Здравствуйте grom_rom, Вы писали:
AF>>Так ты серверный сокет сделай неблокирующим, и accept вместо того, чтобы блокироваться будет AF>>WSAEWOULDBLOCK возвращать.
GR>ой, а как его сделать неблокирующим???
int one;
ioctlsocket(sock, FIONBIO, &one);
GR>и как я узнаю, что пришло соединение ???
select, WSAAsyncSelect, WSAEventSelect, как обычно. Почитай документацию по-внимательнее, там все написано.
Здравствуйте Alex Fedotov, Вы писали:
AF>>>Так ты серверный сокет сделай неблокирующим, и accept вместо того, чтобы блокироваться будет AF>>>WSAEWOULDBLOCK возвращать.
GR>>ой, а как его сделать неблокирующим???
AF>int one; AF>ioctlsocket(sock, FIONBIO, &one);
Имелось в виду
int one = 1;
ioctlsocket(sock, FIONBIO, &one);
GR>>и как я узнаю, что пришло соединение ???
AF>select, WSAAsyncSelect, WSAEventSelect, как обычно. Почитай документацию по-внимательнее, там все написано.
GR>>>и как я узнаю, что пришло соединение ???
AF>>select, WSAAsyncSelect, WSAEventSelect, как обычно. Почитай документацию по-внимательнее, там все написано.
Чесно говоря(прочитав докумментацию) так и не понял, как с помощью функции select() узнать ФАКТ
того, что подключился Клиент!!!!
написанно, что она проверяет возможность чтения и записи в сокет а как узнать тот
момент, когда клиент подключился ??
Это можно сделать без функций WSAAsyncSelect, WSAEventSelect??? — я не хочу их использовать
из-за утраты переносимости (- это не Беркли-функции)
Здравствуйте grom_rom, Вы писали:
GR>>>>и как я узнаю, что пришло соединение ???
AF>>>select, WSAAsyncSelect, WSAEventSelect, как обычно. Почитай документацию по-внимательнее, там все написано.
GR>Чесно говоря(прочитав докумментацию) так и не понял, как с помощью функции select() узнать ФАКТ GR>того, что подключился Клиент!!!! GR>написанно, что она проверяет возможность чтения и записи в сокет а как узнать тот GR>момент, когда клиент подключился ??
GR>Это можно сделать без функций WSAAsyncSelect, WSAEventSelect??? — я не хочу их использовать GR>из-за утраты переносимости (- это не Беркли-функции)
Берем select() и читаем:
--- cut ---
The Windows Sockets select function determines the status of one or more sockets, waiting if necessary, to perform synchronous I/O.
--- cut ---
Тебе этого мало ?
В параметрах есть таймаут ожидания, можно сказать функции, чтобы она заполнила при возврате список сокетов, в которые можно писать, читать и ошибочных.
Здравствуйте TSS, Вы писали:
GR>>Чесно говоря(прочитав докумментацию) так и не понял, как с помощью функции select() узнать ФАКТ GR>>того, что подключился Клиент!!!! GR>>написанно, что она проверяет возможность чтения и записи в сокет а как узнать тот GR>>момент, когда клиент подключился ??
TSS>Берем select() и читаем: TSS>--- cut --- TSS>The Windows Sockets select function determines the status of one or more sockets, waiting if necessary, to perform synchronous I/O. TSS>--- cut ---
TSS>Тебе этого мало ?
Мало. Чуть ниже написано
--- cut ---
Summary: A socket will be identified in a particular set when select returns if:
readfds:
* If listen has been called and a connection is pending, accept will succeed.
...
--- cut ---
Я же не зря попросил, читай внимательно, пожалуйста.
Здравствуйте grom_rom, Вы писали:
AF>>>select, WSAAsyncSelect, WSAEventSelect, как обычно. Почитай документацию по-внимательнее, там все написано.
GR>Чесно говоря(прочитав докумментацию) так и не понял, как с помощью функции select() узнать ФАКТ GR>того, что подключился Клиент!!!! GR>написанно, что она проверяет возможность чтения и записи в сокет а как узнать тот GR>момент, когда клиент подключился ??
GR>Это можно сделать без функций WSAAsyncSelect, WSAEventSelect??? — я не хочу их использовать GR>из-за утраты переносимости (- это не Беркли-функции)
Там же в документации, должно быть сказано, что для Listen советов нотификация в select о write означает, что к сокету присоединились, и следующий accept пройдет без блокировки.
Хотя ты говоришь, что тебе не нужны WSAAsyncSelect, WSAEventSelect, хотел добавить, что их вызов, автоматически переводит сокет в неблокируемый (то есть не требуется дополнительного вызова ioctlsocket).
И в догонку. Все это есть в документации, раз. И два, тема не по адресу, есть же WinAPI причем здесь C/С++.