Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ф-я connect завершается успехом раньше чем вызывается accept=((( [D6, Win95/98, Win2k]


LeReve ©   (2002-11-29 15:08:00) 

кто знает! почему при втором соединение с серваком сомманда connect у клиента завершается (причём успешно!!!) до комманды accept на сервере???
(создают сокеты, 2 на серваке(слушающий и для передачи данных)и 1 другой на клиенте, после окончания передачи файла слиент закрывает сокет, НО при создании следующего сокета, его порядковый номер выше!!!(т.е сокет вроде как бы и не закрыт) если сокет вообще не закрывать у клиента а создавать новый то всё ОК работает! а иначе connect завершается упехом без accept-a
(Только под 2000-й, под 98 порядок!)


Digitman   (2002-12-02 15:53:00) [1]


> ну а если серьёзно такой опции даже в хелпах нет


Да мало ли там чего еще нет ! Иди на msdn.microsoft.com, задавай модель поиска SO_CONDITIONAL_ACCEPT и имей полную информацию)

Давно б уж сходил и выяснил, что к чему... а ты все треплешься)
Оно мненадо ? Оно тебе надо, а не мне !)
Когда это мне понадобилось, я навел справки и выяснил что к чему)
Поэтому и тебе советую, потому что это - единственный верный способ реализовать настоящий условный акцепт с полным пониманием сути проблемы.

Заодно найди и скачай себе winsock2.pas, там константа SO_CONDITIONAL_ACCEPT имеет определение.


LeReve   (2002-12-02 15:34:00) [2]

=))) подравилось про дескрипроры??? =)))
ну а если серьёзно такой опции даже в хелпах нет
SO_CONDITIONAL_ACCEPT


Digitman   (2002-12-02 08:54:00) [3]

бред какой-то)

при чем здесь защищ.режим и Делфи ? чего ты несешь ?

есть спецификация Winsock, ее использование документировано в MSDN, в т.ч. - и использование опции усл.акцепта


LeReve   (2002-12-01 15:50:00) [4]

хаха =))) артист! =))))))))))))))))
SO_CONDITIONAL_ACCEPT где ты вообще такую опцию нашёл то???
и в какой версии делфи????
а локальные дискрыпторые таблицы отображают структуру организации защищённого режима =))) а байт АR описывает параметры сегмента, он является частью дескриптора!!!


Digitman   (2002-12-01 11:41:00) [5]


> ты конешно не обижайся, но чушь какая то если честно


ты конешно не обижайся, но вот эту чушь понять не в состоянии :

> я её класно использовать в локальных дискипротрных таблицах

по-русски повтори)


> а лучше когда седмой бит байта AR установлен в 1


на кой черт тебе в какие-то "таблицы" лезть, когда есть документированный способ организовать условный акцепт ?

приведи код сервера


LeReve   (2002-11-30 18:11:00) [6]

ты конешно не обижайся, но чушь какая то если честно =))))
особенно мне понравилось про опцию
SO_CONDITIONAL_ACCEPT =)))
классная опция! я её класно использовать в локальных дискипротрных таблицах =)) а лучше когда седмой бит байта AR установлен в 1!!!


LeReve   (2002-11-30 18:03:00) [7]

хммм, тогда почему при первой попытке соединения connect не завершается успешно пока не будит произведён accept???


Digitman   (2002-11-30 12:42:00) [8]


> срабытывает раньше чем тут вызовится ф-я accept


Это нормально для любой ОС (вернее, для любой платформенной реализации WINSOCK).
W2k "умеет" организовывать настоящий условный акцепт. Для этого у "слушающего" серверного гнезда опцию SO_CONDITIONAL_ACCEPT нужно устаноыить в True (см. setsockopt). Делать это следует ДО вызова listen(). Для настоящего условного акцепта в этом случае следует вызывать WSAAccept() вместо accept().

Если не предусмотреть эти условия, то - можешь вообще у сервера убрать вызов accept() - вызов клиентом ф-ции connect() всегда будет успешен, ибо "слушающее" гнездо при получении SYN-пакета ВСЕГДА ответит пакетом SYN-ACK (подтверждение). В случае же условного акцептирования этого не происходит до момента возврата из WSAAccept(), при обработке которого сервер имеет возможность либо акцептировать запрос на соединение (вернуть клиенту SYN-ACK, в рез-те чего вызов connect() завершается успешно) либо отвергуть запрос на соединение (вернуть клиенту RST, в рез-те чего вызов connect() завершается с отказом "запрос на соединение отвергнут")


LeReve   (2002-11-29 20:05:00) [9]

очень много переносить предётся, тем более всё по раным модулям....
у сервака одн сокет просто находится в режиме Listen(sock,10)
WsaAsyncSelect(sock,hwin,msg,FD_ACCEPT)
когда конестится клиент то посылается вызываю
datasock:=accept(sock,@name,!size);

при первой попытки соеденениея всё работает!
но при второй же у клиента connect срабытывает раньше чем тут вызовится ф-я accept, только но win2000! под 98 работает то


Digitman   (2002-11-29 15:23:00) [10]


> при создании следующего сокета, его порядковый номер выше!!!> > (т.е сокет вроде как бы и не закрыт)


значение хэндла нового гнезда не имеет никакого отношения к состоянию "закрытости" или "открытости" другого, ранее существовавшего гнезда


> сомманда connect у клиента завершается (причём успешно!!!)
> до комманды accept на сервере


см. setsockopt() и опцию SO_CONDITIONAL_ACCEPT


А вообще - приведи код сервера.
Каша какая-то - "2 на серваке(слушающий и для передачи данных)"


Наверх

Титульная страница Поиск, карта сайта Написать письмо