Есть ли неблокирующий аналог accept(...)
От: grom_rom Россия  
Дата: 20.12.01 10:03
Оценка:
Коллеги!
есть следующая проблема:

Что бы программа поняла, что к ней пытаются коннектится клиенты — надо вызвать
функцию accept(...) — которая блокируется, до тех пор, пока не придёт требование
клиена к подключению (функция клиетна connect(...) )

А как сделать так, чтобы програма не тормозила, на accept(...), а продолжала
дальше работать?? То есть нужен неблокирующий аналог accept(...)!!

1) Есть ли такая функция??
2) Может accept(...) вообще не нужен, и можно (после вызовов функций bind() и listeт())
функцией ioctlsocket() проверять есть ли данные???
3)может как-то иначе решить проблему ???

Заранее благодарен
Девиз настоящих студентов: Не боись — ПРОРВЁМСЯ
Re: Есть ли неблокирующий аналог accept(...)
От: Alex Fedotov США  
Дата: 20.12.01 10:11
Оценка:
Здравствуйте grom_rom, Вы писали:

GR>Что бы программа поняла, что к ней пытаются коннектится клиенты — надо вызвать

GR>функцию accept(...) — которая блокируется, до тех пор, пока не придёт требование
GR>клиена к подключению (функция клиетна connect(...) )

GR>А как сделать так, чтобы програма не тормозила, на accept(...), а продолжала

GR>дальше работать?? То есть нужен неблокирующий аналог accept(...)!!

Так ты серверный сокет сделай неблокирующим, и accept вместо того, чтобы блокироваться будет
WSAEWOULDBLOCK возвращать.
-- Alex Fedotov
Re: Есть ли неблокирующий аналог accept(...)
От: Wizard-2  
Дата: 20.12.01 10:15
Оценка:
Здравствуйте 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
Re[2]: Есть ли неблокирующий аналог accept(...)
От: grom_rom Россия  
Дата: 20.12.01 10:19
Оценка:
Здравствуйте Alex Fedotov, Вы писали:


AF>Так ты серверный сокет сделай неблокирующим, и accept вместо того, чтобы блокироваться будет

AF>WSAEWOULDBLOCK возвращать.

ой, а как его сделать неблокирующим??? и как я узнаю, что пришло соединение ???
Девиз настоящих студентов: Не боись — ПРОРВЁМСЯ
Re[3]: Есть ли неблокирующий аналог accept(...)
От: Alex Fedotov США  
Дата: 20.12.01 10:22
Оценка:
Здравствуйте grom_rom, Вы писали:

AF>>Так ты серверный сокет сделай неблокирующим, и accept вместо того, чтобы блокироваться будет

AF>>WSAEWOULDBLOCK возвращать.

GR>ой, а как его сделать неблокирующим???


int one;
ioctlsocket(sock, FIONBIO, &one);

GR>и как я узнаю, что пришло соединение ???


select, WSAAsyncSelect, WSAEventSelect, как обычно. Почитай документацию по-внимательнее, там все написано.
-- Alex Fedotov
Re[4]: Есть ли неблокирующий аналог accept(...)
От: Alex Fedotov США  
Дата: 20.12.01 10:24
Оценка:
Здравствуйте 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, как обычно. Почитай документацию по-внимательнее, там все написано.
-- Alex Fedotov
Re[5]: Есть ли неблокирующий аналог accept(...)
От: grom_rom Россия  
Дата: 20.12.01 11:31
Оценка:
Здравствуйте Alex Fedotov, Вы писали:


GR>>>и как я узнаю, что пришло соединение ???


AF>>select, WSAAsyncSelect, WSAEventSelect, как обычно. Почитай документацию по-внимательнее, там все написано.


Чесно говоря(прочитав докумментацию) так и не понял, как с помощью функции select() узнать ФАКТ
того, что подключился Клиент!!!!
написанно, что она проверяет возможность чтения и записи в сокет а как узнать тот
момент, когда клиент подключился ??

Это можно сделать без функций WSAAsyncSelect, WSAEventSelect??? — я не хочу их использовать
из-за утраты переносимости (- это не Беркли-функции)
Девиз настоящих студентов: Не боись — ПРОРВЁМСЯ
Re[6]: Есть ли неблокирующий аналог accept(...)
От: TSS Россия http://www.sdl.ru
Дата: 20.12.01 11:38
Оценка:
Здравствуйте 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 ---

Тебе этого мало ?

В параметрах есть таймаут ожидания, можно сказать функции, чтобы она заполнила при возврате список сокетов, в которые можно писать, читать и ошибочных.
Signed, [TSS] /SDL/
Re[7]: Есть ли неблокирующий аналог accept(...)
От: Alex Fedotov США  
Дата: 20.12.01 12:12
Оценка:
Здравствуйте 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 ---

Я же не зря попросил, читай внимательно, пожалуйста.
-- Alex Fedotov
Re[8]: Есть ли неблокирующий аналог accept(...)
От: TSS Россия http://www.sdl.ru
Дата: 20.12.01 12:34
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

[skipped]

AF>Я же не зря попросил, читай внимательно, пожалуйста.


А я, как раз, читал внимательно. Просто эту цитату не стал приводить.
Signed, [TSS] /SDL/
Re[6]: Есть ли неблокирующий аналог accept(...)
От: Sashko Россия http://www.dc.baika.ru/
Дата: 21.12.01 01:55
Оценка:
Здравствуйте grom_rom, Вы писали:

AF>>>select, WSAAsyncSelect, WSAEventSelect, как обычно. Почитай документацию по-внимательнее, там все написано.


GR>Чесно говоря(прочитав докумментацию) так и не понял, как с помощью функции select() узнать ФАКТ

GR>того, что подключился Клиент!!!!
GR>написанно, что она проверяет возможность чтения и записи в сокет а как узнать тот
GR>момент, когда клиент подключился ??

GR>Это можно сделать без функций WSAAsyncSelect, WSAEventSelect??? — я не хочу их использовать

GR>из-за утраты переносимости (- это не Беркли-функции)

Там же в документации, должно быть сказано, что для Listen советов нотификация в select о write означает, что к сокету присоединились, и следующий accept пройдет без блокировки.

Хотя ты говоришь, что тебе не нужны WSAAsyncSelect, WSAEventSelect, хотел добавить, что их вызов, автоматически переводит сокет в неблокируемый (то есть не требуется дополнительного вызова ioctlsocket).

И в догонку. Все это есть в документации, раз. И два, тема не по адресу, есть же WinAPI причем здесь C/С++.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.