Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
2-1152615030
drashka
2006-07-11 14:50
2006.07.30
Проблема с синтаксисом SQL


2-1152168374
begginer
2006-07-06 10:46
2006.07.30
прослушивание порта UDP


2-1152620996
Mishenka
2006-07-11 16:29
2006.07.30
Как перевести сантиметры в пикселы?


2-1152436712
Тимофей Юрьевич
2006-07-09 13:18
2006.07.30
трабл с цветами


2-1152628408
AlexanderMS
2006-07-11 18:33
2006.07.30
Форма "сворачивается".





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский