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

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

ClienSocket и ServerSocket [D6, WinXP]


Страницы:   1 2 3 4

serko ©   (2006-01-27 00:03:00) 

Вот у меня одна прога типа сервер а другая клиент!
Естественно что Клиент подключается к уже запущенному Серверу.
Но вот если запустить клиента когда сервер еще не запущен то выскакивает ошибка "Asynchronous socket error 10061".
Как сделать так чтобы Клиент подключался до тех пор пока не запустится Сервер, без вывода этой ошибки?


Digitman   (2006-02-14 16:05:00) [41]

try
 CS.Open;
except
.. не удалось соединиться по тем или иным причинам ..
end;

...

try
 CS.SendText('Текст');
except
.. не удалось передать данные по тем или иным причинам ..
end;

...

try
 RcvdText := CS.ReceiveText;
except
.. не удалось принять данные по тем или иным причинам ..
end;


serko   (2006-02-14 15:58:00) [42]

Хорошо! А ты можеш привести причерчик работы  для режима ctBlocking?


Digitman   (2006-02-14 15:49:00) [43]

Точнее так - для приема/передачи данных с использованием класса TWinSocketStream этот режим действительно обязателен.

Но ничто не мешает обходиться без TWinSocketStream и безо всяких "потоков". Здесь важно другое - методы коннекта/приема/передачи в режиме ctBlocking являются синхронными, из вызовы блокируют выполнение последующих операторов до момента успешного выполнения либо возникновения искл.ситуации


Digitman   (2006-02-14 15:37:00) [44]


> serko ©   (14.02.06 15:32) [25]


> Этот тип соединения полезен для организации обмена данными
> с помощью потоков


Заметь - именно полезен!
Но вовсе не обязателен.


serko   (2006-02-14 15:32:00) [45]


> Чего-чего ?!


Ну вот я в одной из статеек нашел:
ClientType - тип соединения. ctNonBlocking - асинхронная передача данных, т.е. посылать и принимать данные по сокету можно с помощью OnRead и OnWrite. ctBlocking - синхронная (одновременная) передача данных. События OnRead и OnWrite не работают. Этот тип соединения полезен для организации обмена данными с помощью потоков (т.е. работа с сокетом как с файлом);


Digitman   (2006-02-14 15:23:00) [46]


> это получается что с сокетом нужно работать как с потоком


Чего-чего ?!


> у меня уже много сделано для ctNonBlocking


И, видимо, неправильно сделано, потому и глюк на глюке.

Методы открытия/передачи/приема в режиме ctNonBlocking работают асинхронно, а для извещения об асинхронных ошибках как раз и придуманы события On[Client]Error.


serko   (2006-02-14 15:17:00) [47]

Да действительно помогло, но это получается что с сокетом нужно работать как с потоком, а у меня уже много сделано для ctNonBlocking


Digitman   (2006-02-14 14:56:00) [48]


> Почему тогда не помогает в этом случае?


Потому что это совершенно другой случай.

Ставь ClientType = ctBlocking - поможет и в этом случае.


serko   (2006-02-14 14:51:00) [49]

Почему тогда не помогает в этом случае?

Try
 ClientSocket1.Open;
Except
End;


Digitman   (2006-02-14 14:09:00) [50]

procedure TSomeForm.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
with ServerSocket1.Socket do
for i := 0 to ActiveConnections-1 do
if Connections[i] <> Socket
try
 Connections[i].SendText('#N');
except
end;
end;


serko   (2006-02-14 13:44:00) [51]


> Не выдумывай, замечательно "помогает"

Ну покажи пример в котором помогает! У меня всеравно выскакивают ошибки!


Digitman   (2006-02-14 13:13:00) [52]


> Как же его тогда удалить из списка Включенных?


А никак его не надо удалять ..

Он сам "удалится" сразу же после возврата из обработчика OnClientDisconnect


> использование Try и Except тоже не помогает


Не выдумывай, замечательно "помогает"


serko   (2006-02-14 13:08:00) [53]

Хорошо уговорил, происходит такое!
Как же его тогда удалить из списка Включенных?

использование Try и Except тоже не помогает!


Digitman   (2006-02-14 11:39:00) [54]

см. http://citrix.pp.ru/faqs/tcp_errors.html
10059 WSAETOOMANYREFS Too many references (Слишком много ссылок).
На какой-то объект ядра создано слишком много ссылок, превышающих системные ресурсы.


> Какие ошибки?


В момент OnClientDisconnect отключившийся клиент все еще присутствует в списке ActiveConnections, хотя "связь" с ним уже невозможна (любые попытки передачи/приема инф-ции, относящейся к этому клиенту, приведут к исключению)


serko   (2006-02-14 11:23:00) [55]

Какие ошибки?
на сервере все происходит так:
OnAccept и OnClientDisconnect -
ListView1.Items.Clear;
for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
ServerSocket1.Socket.Connections[i].SendText('#N');

OnClientError - ErrorCode:=0;

OnClientRead - обрабатываются сообщения от Клиента!


Digitman   (2006-02-14 08:29:00) [56]


> Что еще можна сделать?


Исправить ошибки в коде сервера.


serko   (2006-02-13 22:54:00) [57]

Странно, но она всеравно выскакивает!
Расскажу подробно че я сделал:
В FormCreate: ClientSocket1.Open;
В таймере: If not ClientSocket1.Active then
                       ClientSocket1.Open;
Ну и в ClientSocket1Error: Errorcode := 0;
                                   Socket.Close;
                                   ClientSocket1.Close;

Все вроде бы сначала ок, но иногда (при переодическом запуска\закрытии серверной программы), появляются такие глюки: на сервере сразу при запуске "Stack overlow", а на клиентской при обработке события в таймере ошибка "Asynchronous socket error 10059" API "connect".

Что еще можна сделать?


serko   (2006-02-03 17:39:00) [58]

Вообще я сделал вроде - ошибка больше не выскакивает! Спасибо всем!


Digitman   (2006-02-01 10:09:00) [59]


> не предирался к каждому слову, а помог бы


Ну как тебе помочь, если ты вразумительно задачу/проблему описать не можешь ?

После успешного установления соединения, если сервер разрывает его по своей инициативе, у клиента возникает событие OnDisconnect, в обработчике которого, например, следует асинхронно послать форме (на которой лежит ClientSocket) условное сообщение, при получении и обработке которого выполняется ClientSocket.Open


kami   (2006-02-01 01:33:00) [60]

serko ©   (01.02.06 0:35) [9]
Если такой знающий, то почему строем не ходишь?


Страницы:   1 2 3 4

Наверх

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