Форум: "Сети";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];
Вниз
ClienSocket и ServerSocket Найти похожие ветки
← →
serko © (2006-01-27 00:03) [0]Вот у меня одна прога типа сервер а другая клиент!
Естественно что Клиент подключается к уже запущенному Серверу.
Но вот если запустить клиента когда сервер еще не запущен то выскакивает ошибка "Asynchronous socket error 10061".
Как сделать так чтобы Клиент подключался до тех пор пока не запустится Сервер, без вывода этой ошибки?
← →
Digitman © (2006-01-27 09:13) [1]в событии OnError:
Errorcode := 0;
Socket.Close;
ClientSocket.Open;
← →
serko © (2006-01-27 23:31) [2]Оооооооооо Спасибо тебе большое!
← →
serko © (2006-01-31 00:55) [3]Че то оно, работает но не всегда, точнее неработает не всегда! Вообщем только иногда работает!
Все я сделал как посоветовал:
> Digitman © (27.01.06 09:13) [1]
Но подключение почему то не происходит! у меня все делается по сети т.е. Серверная программа на одном компе а Клиентская на другом!
Может чето еще посоветуете?
← →
serko © (2006-01-31 01:22) [4]Вот что только что заметил!
Если Клиентская программа запущена и потом запустить Серверную, то все ок, а если сразу же закрыть Серверную и снова открыть то уже не пашет!
Че надо изменить или добавить?
← →
Digitman © (2006-01-31 08:25) [5]
> если сразу же закрыть Серверную и снова открыть то уже не
> пашет
А что должно "пахать"-то ?
Коннект ведь успешно состоялся .. т.е. ответ на свой первоначальный вопрос ты получил ..
← →
serko © (2006-01-31 15:35) [6]
> А что должно "пахать"-то ?
Ну при втором запуске серверной программы не происходит соединение с клиентом.
← →
Digitman © (2006-01-31 16:22) [7]
> при втором запуске серверной программы не происходит соединение
> с клиентом.
И с какого перепугу сервер при запуске должен вдруг соединяться с каким-то там сраным клиентом ?
← →
kami © (2006-01-31 21:42) [8]Digitman © (31.01.06 16:22) [7]
:)))
serko © (31.01.06 15:35) [6]
При отключении клиента срабатывает OnDisconnect, а не OnError. Дальше - включаем логическое мышление и сопостовляем с Digitman © (27.01.06 9:13) [1]
← →
serko © (2006-02-01 00:35) [9]
> Digitman © (31.01.06 16:22) [7]
а я бы на твоем месте не предирался к каждому слову, а помог бы!
> При отключении клиента срабатывает OnDisconnect, а не OnError.
Это я и без тебя знаю!
← →
kami © (2006-02-01 01:33) [10]serko © (01.02.06 0:35) [9]
Если такой знающий, то почему строем не ходишь?
← →
Digitman © (2006-02-01 10:09) [11]
> не предирался к каждому слову, а помог бы
Ну как тебе помочь, если ты вразумительно задачу/проблему описать не можешь ?
После успешного установления соединения, если сервер разрывает его по своей инициативе, у клиента возникает событие OnDisconnect, в обработчике которого, например, следует асинхронно послать форме (на которой лежит ClientSocket) условное сообщение, при получении и обработке которого выполняется ClientSocket.Open
← →
serko © (2006-02-03 17:39) [12]Вообще я сделал вроде - ошибка больше не выскакивает! Спасибо всем!
← →
serko © (2006-02-13 22:54) [13]Странно, но она всеравно выскакивает!
Расскажу подробно че я сделал:
В 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".
Что еще можна сделать?
← →
Digitman © (2006-02-14 08:29) [14]
> Что еще можна сделать?
Исправить ошибки в коде сервера.
← →
serko © (2006-02-14 11:23) [15]Какие ошибки?
на сервере все происходит так:
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 11:39) [16]см. http://citrix.pp.ru/faqs/tcp_errors.html
10059 WSAETOOMANYREFS Too many references (Слишком много ссылок).
На какой-то объект ядра создано слишком много ссылок, превышающих системные ресурсы.
> Какие ошибки?
В момент OnClientDisconnect отключившийся клиент все еще присутствует в списке ActiveConnections, хотя "связь" с ним уже невозможна (любые попытки передачи/приема инф-ции, относящейся к этому клиенту, приведут к исключению)
← →
serko © (2006-02-14 13:08) [17]Хорошо уговорил, происходит такое!
Как же его тогда удалить из списка Включенных?
использование Try и Except тоже не помогает!
← →
Digitman © (2006-02-14 13:13) [18]
> Как же его тогда удалить из списка Включенных?
А никак его не надо удалять ..
Он сам "удалится" сразу же после возврата из обработчика OnClientDisconnect
> использование Try и Except тоже не помогает
Не выдумывай, замечательно "помогает"
← →
serko © (2006-02-14 13:44) [19]
> Не выдумывай, замечательно "помогает"
Ну покажи пример в котором помогает! У меня всеравно выскакивают ошибки!
← →
Digitman © (2006-02-14 14:09) [20]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 14:51) [21]Почему тогда не помогает в этом случае?
Try
ClientSocket1.Open;
Except
End;
← →
Digitman © (2006-02-14 14:56) [22]
> Почему тогда не помогает в этом случае?
Потому что это совершенно другой случай.
Ставь ClientType = ctBlocking - поможет и в этом случае.
← →
serko © (2006-02-14 15:17) [23]Да действительно помогло, но это получается что с сокетом нужно работать как с потоком, а у меня уже много сделано для ctNonBlocking
← →
Digitman © (2006-02-14 15:23) [24]
> это получается что с сокетом нужно работать как с потоком
Чего-чего ?!
> у меня уже много сделано для ctNonBlocking
И, видимо, неправильно сделано, потому и глюк на глюке.
Методы открытия/передачи/приема в режиме ctNonBlocking работают асинхронно, а для извещения об асинхронных ошибках как раз и придуманы события On[Client]Error.
← →
serko © (2006-02-14 15:32) [25]
> Чего-чего ?!
Ну вот я в одной из статеек нашел:
ClientType - тип соединения. ctNonBlocking - асинхронная передача данных, т.е. посылать и принимать данные по сокету можно с помощью OnRead и OnWrite. ctBlocking - синхронная (одновременная) передача данных. События OnRead и OnWrite не работают. Этот тип соединения полезен для организации обмена данными с помощью потоков (т.е. работа с сокетом как с файлом);
← →
Digitman © (2006-02-14 15:37) [26]
> serko © (14.02.06 15:32) [25]
> Этот тип соединения полезен для организации обмена данными
> с помощью потоков
Заметь - именно полезен !
Но вовсе не обязателен.
← →
Digitman © (2006-02-14 15:49) [27]Точнее так - для приема/передачи данных с использованием класса TWinSocketStream этот режим действительно обязателен.
Но ничто не мешает обходиться без TWinSocketStream и безо всяких "потоков". Здесь важно другое - методы коннекта/приема/передачи в режиме ctBlocking являются синхронными, из вызовы блокируют выполнение последующих операторов до момента успешного выполнения либо возникновения искл.ситуации
← →
serko © (2006-02-14 15:58) [28]Хорошо! А ты можеш привести причерчик работы для режима ctBlocking?
← →
Digitman © (2006-02-14 16:05) [29]try
CS.Open;
except
.. не удалось соединиться по тем или иным причинам ..
end;
...
try
CS.SendText("Текст");
except
.. не удалось передать данные по тем или иным причинам ..
end;
...
try
RcvdText := CS.ReceiveText;
except
.. не удалось принять данные по тем или иным причинам ..
end;
← →
serko © (2006-02-14 16:37) [30]Ну всеравно появляются вопросы:
1. В каких событиях обрабатывать эти примеры для СЕРВЕРА и КЛИЕНТА, ведь в таком случае OnRead и OnClientRead не срабатывают?
2. Как узнать что удаленная машина отправила текст, чтобы я смог вызвать ПРИЕМ?
← →
Digitman © (2006-02-14 16:42) [31]
> 1. В каких событиях обрабатывать эти примеры для СЕРВЕРА
> и КЛИЕНТА, ведь в таком случае OnRead и OnClientRead не
> срабатывают?
А что , разве на событиях свет клином сошелся ? Без событий уже никак ?
> 2. Как узнать что удаленная машина отправила текст, чтобы
> я смог вызвать ПРИЕМ?
Если TCustomWinSocket.ReceiveLength() вернула результат больше 0, это говорит о непустом буфере приема
← →
serko © (2006-02-14 16:52) [32]Ну ладно хватит на сегодня тебя мучать, ты мне и так много чего разъяснил и за это тебе большое спасибо! Ну если что, то я вернусь!
← →
Digitman © (2006-02-14 17:31) [33]
> Ну ладно хватит на сегодня тебя мучать
Приходите еще).. Желательно - со своими тапками
← →
serko © (2006-02-16 16:54) [34]И вот я снова тут, в своих тапках! :)
Мне все же хочется сделать по-моему т.е. с ctNonBlocking.
У меня клиентские программы стоят на слабеньких компах с WIN 98, по сравнению с сервером WIN XP - Celeron 2000 Mhz.
Наверное поэтому на клиентах через некоторое время и выскакивает ошибка типа:
"10055 WSAENOBUFS No buffer space available (Закончились буферы).
Невозможно осуществить операцию с сокетом, поскольку системе не хватает буферного пространства или переполнена очередь. Это означает, что WinSock временно не хватает буфров. Это не должно вызывать проблем, если не продолжается долгое время."
Как я уже говорил у меня в таймере происходит:
If not ClientSocket1.Active then
ClientSocket1.Open;
Try
Begin
ClientSocket1.Socket.SendText("Text");
End;
Except
End;
Может как-то можна очищать этот буфер? На более мощных компах, за такой же промежуток времени ошибка не выскакивает!
Задача все таже! Клиент должен пытаться подключиться к серверу, до успешного соеденения. Вслучае разрыва связи все должно повторяться! И что самое главное БЕЗ выскакивающих ОШИБОК!
← →
Digitmn (2006-02-17 12:30) [35]
> Клиент должен пытаться подключиться к серверу, до успешного
> соеденения
Фактом успешного соединения является факт возникновения события OnConnect
← →
serko © (2006-02-18 21:09) [36]Вот сегодня оставил клиентскую прогу на более менее нормальном компе, так при выключеной серверной программе, сутки простояла и все ок! А на слабых компах глючит!
Что посоветуете? Можно ли как то буфер чистить?
← →
serko © (2006-02-21 22:32) [37]Что нет вариантов?
А у меня еще вопросы появились:
1. Что означает ошибка Stack Overflow? Я так подозреваю она происходит при выполнении кода:
for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
ServerSocket1.Socket.Connections[i].SendText("#N");
Суть его такова, что отсылается запрос на NiCkName КЛИЕНТА ввиде "#N", и потом уже каждый клиент присылает СЕРВЕРУ свой NickName. На нормальных компах эта ошибка не выскакивает, но почемуто приходит 2 ответа на запрос в виде "#NUser_1#NUser_1". Помогите разобраться!
2. И еще на КЛИЕНТ у меня стоит на 10 компах с 98 виндой, так вот на 9 прога запускается нормально, а на 10-ом при попытке открыть Сокет пишет "Can"t create new socket". Что это может быть? Может в винде надо чето настроить?
Ребя помогите в этом разобраться!
← →
atruhin © (2006-02-22 06:42) [38]1. у тебя ошибки в программе.
2. в windows есть ограничение на кол-во одновременных подключений, не более 10, этого ограничения нет у серверных систем.
← →
Сергей М. © (2006-02-22 11:09) [39]
> Что означает ошибка Stack Overflow?
Переполнение стека.
Где-то ты допустил бесконечную рекурсию.
← →
serko © (2006-02-22 14:18) [40]1. Что такое рекурсия? Это связано с СОКЕТАМИ?
Эта ошибка на Pentium 133 выскакивает сразу при запуске проги, а на Athlon 2000+ ее нет вообще!
2. Но ведь не более 10, а 10 же еще можна?
3. И еще вопрос не в тему: Как в ListView программно выделить все имеющиеся Item?
Страницы: 1 2 вся ветка
Форум: "Сети";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.013 c