Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | | | | |
С UDP все ясно, TCP в том-то и дело?!@ 27.10.01 22:08 Число просмотров: 874
Автор: ggg <ggg> Статус: Elderman
|
наверно это особенность маздайной реализации
типа если законнектиться невозможно, то и не зачем ждать приложению
а что говорит getsockopt(SO_ERROR) ?
|
<programming>
|
Fd_connect 27.10.01 11:22
Автор: Heromantor Статус: Незарегистрированный пользователь
|
Что-то я не пойму когда посылается это сообщение или что-то там еще. Если я сделаю WSAEventSelect(s,events,FD_CONNECT) а потом connect то если я не порублен к инету то ОНО все равно устанавливается независимо от того сконектился я или нет, в принципе для этого я давно уже пользую FD_WRITE но интересно узнать что-же такое с FD_CONNECT?
Прошу прощения за каламбур
|
|
Fd_connect 27.10.01 14:02
Автор: Лamo Статус: Незарегистрированный пользователь
|
Всё очень просто,
делаешь сокет,
создаёшь событие - WSAEVENT hEvent = WSACreateEvent
потом вызывай всаэвентселект -
WSAEventSelect(sock, hEvent, FD_READ | FD_WRITE | FD_CONNECT | FD_CLOSE);
потом коннектся - connect,
потом залупливай бесконечный луп и жди событий
while(1)
{
DWORD dwRet = WSAWaitForMultipleEvents(1, &hEvent, FALSE, 5000, FALSE);
5000 - это время таймаута ожидания или коннекта или send или recv
if(dwRet == WSA_WAIT_TIMEOUT)
{
MessageBox("timeout!", "", 0);
break;
}
потом вызывай -
WSANETWORKEVENTS events;
WSAEnumNetworkEvents(sock, hEvent, &events);
потом смари чо за события у тебя -
if(events.lNetworkEvents & FD_CONNECT)
{
сдесь мы сконнектились, и можно уже слать или принимать данные, в зависимости от того что те надо, например есл ты конектися на хттп, то те сдесь надо отправлять запрос, если смтп то принимать ответ 220
}
if(events.lNetworkEvents & FD_READ)
{
сюда попадёшь если сокет готов к передачи данных
}
if(events.lNetworkEvents & FD_WRITE)
{
сдесь к приёму данных
}
if(events.lNetworkEvents & FD_CLOSE)
{
событие закрытия сокета
}
}
в конце закрывай сокет - closesoket
и события - WSACloseEvent
И если надо, не забудь выходить из лупа брейком
|
| |
Это-то я знаю, проблема в другом. 27.10.01 14:40
Автор: Heromantor Статус: Незарегистрированный пользователь
|
А проблема в том-что, если я делаю WSAEventSelect на одно событие FD_CONNECT, и пускаю прогу, то устанавливаеться event низависимо от того законектился я или нет, причем WaitForMultipleObjects вылетает сразу и не ждет тайм-аута т.е. event усатанавливается сразу после connect? Че это такое и почему на хрен мне вызыватьenumесли это не надо т.к. до конекта никакие события с сокетом происходить не могут!
|
| | |
Это-то я знаю, проблема в другом. 27.10.01 15:15
Автор: Лamo Статус: Незарегистрированный пользователь
|
Чо то я не понял что ты хочешь,
Кароче, для чего нужен FD_CONNECT - Фишка в том,
что када ты вызываешь WSAEventSelect
то какимто образом сокет переходит в не блокирующее состояние, и connect выполняется практически всегда,
и уже дальше, если соединение установлено, то как раз срабатывает событие FD_CONNECT значащее то, что сокет готов к приёму или передаче данных,
а если, к примеру, не возможно поключица на данный хост с некоторым портом, - ну порт закрыт,
то срабатывает таймаут, и событие FD_CONNECT не происходит
|
| | | |
Дело в том... 27.10.01 16:16
Автор: Heromantor Статус: Незарегистрированный пользователь
|
если соединение установлено, то как раз
> срабатывает событие FD_CONNECT значащее то, что сокет готов > к приёму или передаче данных, > а если, к примеру, не возможно поключица на данный хост с > некоторым портом, - ну порт закрыт, > то срабатывает таймаут, и событие FD_CONNECT не происходит
Во-во! так и должно быть, но если я не подрублен к инету в настоящий момент то событие все равно устанавливается в signaled, причем моментально после connect?! Вот в чем проблема-то!
|
| | | | |
Дело в том... 28.10.01 10:48
Автор: Лamo Статус: Незарегистрированный пользователь
|
ХаХаХа :)) ну ты даёшь!!!
если ты не подрублен к инету,
то вопервых gethostbyname будет возвращать NULL,
значащее то, что соединения с инетом нету или хост не доступен, а терь подумай что будет если ты дальше будешь юзать указатель на HOSTENT == NULL :)))
|
| | | | |
а сокет какой ? UDP или TCP ? 27.10.01 17:23
Автор: ggg <ggg> Статус: Elderman
|
|
| | | | | |
С UDP все ясно, TCP в том-то и дело?!@ 27.10.01 18:44
Автор: Heromantor Статус: Незарегистрированный пользователь
|
|
| | | | | | |
С UDP все ясно, TCP в том-то и дело?!@ 27.10.01 22:08
Автор: ggg <ggg> Статус: Elderman
|
наверно это особенность маздайной реализации
типа если законнектиться невозможно, то и не зачем ждать приложению
а что говорит getsockopt(SO_ERROR) ?
|
|
|