Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.02;
Скачать: CL | DM;

Вниз

Пример работы с компонентом XXSocket   Найти похожие ветки 

 
Даддитс   (2007-05-05 15:45) [0]

To Vladimir Kladov: Дайте, пожалуйста, пример работы компонента XXSocket. А то ни XSocket, ни XXSocket нигде не документированы никак, и идут без примеров. И в книге тоже ничего нет.


 
Vladimir Kladov   (2007-05-05 17:50) [1]

Специально я ничего не писал, чтобы для демонстрации. Сразу встраивал в свой код. Уже и не помню деталей. Вытащить могу из своего кода, например, чат. (Неужели какие-то трудности? Мне показалось, что там все достаточно прозрачно, когда делал, никаких принципиальных трудностей не встретил, хотя с сокетами имел первый раз в жизни дело).


 
Даддитс   (2007-05-05 19:55) [2]

Да у меня постоянно ругается на WSAECONNECT, вот и думаю может ошибку где допустил. Пишу простой tcp-клиент.
> Vladimir Kladov   (05.05.07 17:50) [1]
> Вытащить могу из своего кода, например, чат.

было бы здорово, посмотреть некоторые моменты.


 
Vladimir Kladov   (2007-05-05 21:44) [3]

А подробнее можно узнать, что за WSAECONNECT. Кто ругается, сообщение какое.


 
Даддитс   (2007-05-05 23:37) [4]


.....
var
Sock: PClient;
.....

procedure OnSocketError(Dummy: Pointer; Sender: PObj; const Error: Integer);
begin
MessageBox(  GetForegroundWindow, PChar( Err2Str( Error ) ), "", 0);
end;

procedure TForm1.Button1Click(Sender: PObj);
const
CRLF = #13#10;
strRequest =
 "GET /update/data.zip HTTP/1.0" + CRLF +
 "User-Agent: WebUpdater/1.0 (KOL)" + CRLF +
 "Host: localhost";
var
Buf: string;
begin
Sock:= NewClient;
Sock.OnError:= TOnError( MakeMethod(nil, @OnSocketError) );
Sock.Host:= "localhost";
Sock.Port:= 80;
Sock.Connect;
Buf:= strRequest + CRLF + CRLF;
Sock.Send( Buf[1], Length(Buf) );
end;

procedure TForm1.Button2Click(Sender: PObj);
begin
if Assigned(Sock) then
begin
 if Sock.Connected then Sock.DoClose;
 Sock.Free;
end;
end;

примерно так: при щелчке на одну кнопку объект создается, при щелчке на другую соединение закрывается и объект уничтожается.

Назначил специально обработчик OnError, oшибка выскакивает на Sock.Send, по коду ошибки видно, что это WSAENOTSOCK.

Проблем с локальным HTTP-сервером нет, доступен из других программ нормально.


 
Vladimir Kladov   (2007-05-06 15:51) [5]

я через сокет с портом 80 не работал. У меня свой порт был, свой протокол обмена, который я для своих нужд сам и сочинил. Возьмите для работы с http готовые компоненты, у нас же вроде было что-то.


 
D[u]fa ©   (2007-05-06 16:01) [6]

Даддитс  для хттп и подобных протоколов заюзай синапс


 
AndreyRus   (2007-05-06 16:48) [7]


> Даддитс  для хттп и подобных протоколов заюзай синапс


А еще лучше API, ничего сложного там нет.


 
Даддитс   (2007-05-06 17:01) [8]


> Vladimir Kladov   (06.05.07 15:51) [5]
> я через сокет с портом 80 не работал. У меня свой порт был,
>  свой протокол обмена, который я для своих нужд сам и сочинил.

по идее разницы нет, ведь сервер должен принимать соединение и принимать данные, посланные через сокет. Здесь же возникет ошибка сразу, при попытке отправки любых данных на сокет.

>  Возьмите для работы с http готовые компоненты, у нас же
> вроде было что-то.

есть компонент, запрашивающий хтмл-страницу (kolhttp). Он не годится для работы с другими методами (не GET), и позволяет только чистый хтмл получать.


 
Даддитс   (2007-05-06 17:05) [9]


> AndreyRus   (06.05.07 16:48) [7]
>> Даддитс  для хттп и подобных протоколов заюзай синапс
> А еще лучше API, ничего сложного там нет.

по сути, xxsocket - это враппер над АПИ. Можно конечно заюзать АПИ, но хотелось бы разобраться с xxsocket (легкий модуль и базовая функциональность, то что надо). Синапс ведь тяжелее будет, а мне нужны только базовые функции - получить/отправить блок данных через сокет.


 
Даддитс   (2007-05-06 17:10) [10]

To Vladimir Kladov:

> > Vladimir Kladov   (06.05.07 15:51) [5]> я через сокет
> с портом 80 не работал. У меня свой порт был,>  свой протокол
> обмена, который я для своих нужд сам и сочинил.по идее разницы
> нет, ведь сервер должен принимать соединение и принимать
> данные, посланные через сокет. Здесь же возникет ошибка
> сразу, при попытке отправки любых данных на сокет.

Я тут попробовал - эта ошибка выдаетя вообще при попытке коннекта к любому открытому порту, так что проблема не в ХТТП-протоколе. Я сначала думал что проблема в http keepalive. Вообще при попытке отправки данных вылетает WSAECONNECT.


 
Vladimir Kladov   (2007-05-06 20:30) [11]

Правильно, видмимо порт уже захвачен приложением (системой) которое его первое открыло. Так что работать через сокеты с http все равно не получится.


 
Даддитс   (2007-05-06 21:18) [12]


> Vladimir Kladov   (06.05.07 20:30) [11]
> Правильно, видмимо порт уже захвачен приложением (системой)
> которое его первое открыло. Так что работать через сокеты
> с http все равно не получится.

Но ведь я пытаюсь делать клиентский сокет. Или параметр Port для Pclient - это порт, который он сам открывает? %) Я думал это порт, на который он пытается приконнектиться, в случае если он клиент.. (а ведь он клиент). Или xxsocket поволяет только сервера писать? %)


 
GMax   (2007-05-07 23:53) [13]

а WinSock вообще где-то инициализируется ?


 
GMax   (2007-05-08 00:02) [14]

вопрос снимается, посмотрел на xxsockets :)
просто WSAENOTSOCK очень часто именно в этом случае случается.
а WSAECONNECT - это "connection reset by peer", так что может быть это "другая сторона" дурит, файрвол например


 
Даддитс   (2007-05-08 17:50) [15]


> GMax   (08.05.07 00:02) [14]
> вопрос снимается, посмотрел на xxsockets :)просто WSAENOTSOCK
> очень часто именно в этом случае случается.

по идее, если все нормально, WSAENOTSOCK не должен возвращаться.

>а WSAECONNECT
> - это "connection reset by peer", так что может быть это
> "другая сторона" дурит, файрвол например
Все это полностью исключено, тестирую на локалхосте без файрволов, на "Денвере" на базе apache 1.3.33 (win32). Насчет WSAECONNECT (в случае connection reset by peer) я тоже подозревал (см. выше про keepalive), но оказалось что WSAECONNECT выдается и при соединении когда keepalive вообще нет. Я специально проверил.

На мой взгляд, проблемы с самим xxsocket, я примера использования не видел и все чисто по своему разумению делал. Так что мог ошибиться, - код выше есть, - и в таком виде он глючит.

Скорее всего, счас я буду пользовать KOLTCPSocket для своих нужд, хоть он и больше весит и все такое. Сам xxsocket в основном работоспособный, но некоторые куски сырые, как видно выше. У меня нет времени разбираться с очевидными багами, к сожалению. Будет здорово, если какой-нибудь сетевик программер займется xxsocket и доведет его до ума.


 
misha_shar ©   (2007-05-08 18:03) [16]

Компоненты xxSocket правильно сделаны и по моему вполне работоспособны.
Я на них сделал обмен и он работает. Правда у меня были замечания Кладову.
Но они были связаны с работой в UNICODe я их сообщал Владимиру но он на
мое письмо ничего не ответил. Видно не хочет лезть в переферийные программы.
Но и без исправлений там обмен идет нормально. Программы писать очень просто.
Но имей ввиду что обмен ассинхронный и отдавать команду Send пока нет
коннекта нельзя. обмен организуется просто. Запускаешь сервер и задаешь
порт прослушки, но смотри чтобы этот порт был свободен. Запускаешь
клиента задав ему IP адрес сервера и порт прослушки сервера, отдаешь
команду Connect и ждешь когда клиент законнектится и только потом
можно отдавать команды Send. Но имей ввиду что обмен буферизован не
твоей программой и поэтому получать ты можешь или несколько сообщений
сразу или часть одного из них поэтому задай символ конца сообщения
и обрабатывай его наличие. Дерзай! Не связывайся с API.


 
Даддитс   (2007-05-08 19:26) [17]


> misha_shar ©   (08.05.07 18:03) [16]
> Компоненты xxSocket правильно сделаны и по моему вполне
> работоспособны.Я на них сделал обмен и он работает.
Я и не говорю, что они не работоспособны, но их еще надо заставить работать %) Нет примеров и я не разобрался в своей конкретной задаче. Если не сложно, скинь рабочий пример, посмотрю,может что можно сделать для обмена с http-сервером.

> Но и без исправлений там обмен идет нормально. Программы
> писать очень просто.Но имей ввиду что обмен ассинхронный
> и отдавать команду Send пока нетконнекта нельзя. обмен организуется
> просто. Запускаешь сервер и задаешьпорт прослушки, но смотри
> чтобы этот порт был свободен. Запускаешьклиента задав ему
> IP адрес сервера и порт прослушки сервера, отдаешькоманду
> Connect и ждешь когда клиент законнектится и только потомможно
> отдавать команды Send. Но имей ввиду что обмен буферизован
> нетвоей программой и поэтому получать ты можешь или несколько
> сообщенийсразу или часть одного из них поэтому задай символ
> конца сообщенияи обрабатывай его наличие.

Скинь пример, посмотрим. Может сделаю с помощью xxsocket.


 
Vladimir Kladov   (2007-05-08 21:47) [18]

Поправляю: правильно сделан xsocket (респект автору). Правда, там мне кучу багов и ликов пришлось исправить, и я добавил еще один x.


 
misha_shar ©   (2007-05-11 09:25) [19]

Я когда то изучал обмен и написал этот пример. Это клиентская часть. Как я понял она то тебе и нужна.
Клиент может как посылать сообщения так и принимать их. Пример был сделан в МСК и я часть программы
к делу не относящуюся убрал, но суть дела сохранена. Серверную часть я тоже не посылаю. Если она тебе
понадобится то вышлю следующий раз.

   Form: PControl;
 {$ELSE not_KOL_MCK}
 TForm1 = class(TForm)
 {$ENDIF KOL_MCK}
   KOLProject1: TKOLProject;
   KOLForm1: TKOLForm;
   Panel1: TKOLPanel;
   Panel2: TKOLPanel;
   eSnd: TKOLEditBox;
   Panel3: TKOLPanel;
   InBuf: TKOLMemo;
   Toolbar1: TKOLToolbar;
   procedure KOLForm1FormCreate(Sender: PObj);
   procedure Toolbar1TB1Click(Sender: PControl; BtnID: Integer);
   procedure Toolbar1TB2Click(Sender: PControl; BtnID: Integer);
   procedure Toolbar1TB3Click(Sender: PControl; BtnID: Integer);
 private
   { Private declarations }
 procedure ClntCon(Sender: PClient);
 procedure ClntDisc(Sender: PBaseSocket);
 procedure ClntRcv(Sender: PBaseSocket; Buf: PChar; Count: Integer;var NextTimeBufLen: Integer);
 public
   { Public declarations }
 end;

var
 Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;

{$IFDEF KOL_MCK}
procedure NewForm1( var Result: PForm1; AParent: PControl );
{$ENDIF}

implementation

var
 Clnt:PClient;
const cCR : String = KOLString(#13+#10) ;

{$IFNDEF KOL_MCK} {$R *.DFM} {$ENDIF}

{$IFDEF KOL_MCK}
{$I Unit1_1.inc}
{$ENDIF}

procedure TForm1.KOLForm1FormCreate(Sender: PObj);
begin
Clnt:=NewClient;
Form.Add2AutoFree(Clnt);
Clnt.Tag=0;
Clnt.Host:="127.0.0.1"; //IP сервера
Clnt.Port:=1510; //порт сервера
Clnt.OnConnect:=ClntCon;
Clnt.OnDisconnect:=ClntDisc;
Clnt.OnReceive:=ClntRcv;
end;

procedure TForm1.ClntCon(Sender: PClient);
begin
InBuf.Add("Connect "+cCR);
Clnt.Tag=1;
//здесь уже можно передавать сообщения серверу если надо
end;

procedure TForm1.ClntDisc(Sender: PBaseSocket);
begin
Clnt.Tag=0;
InBuf.Add("DisConnect "+cCR);
end;

procedure TForm1.Toolbar1TB1Click(Sender: PControl; BtnID: Integer);
begin
Clnt.Connect;
//здесь нельзя передавать сообщения серверу!!! коннекта еще точно нет
end;

procedure TForm1.Toolbar1TB2Click(Sender: PControl; BtnID: Integer);
begin
Clnt.Disconnect;
end;

procedure TForm1.ClntRcv(Sender: PBaseSocket; Buf:PChar;Count:Integer; var NextTimeBufLen: Integer);
begin
InBuf.Add(Buf);
end;

procedure TForm1.Toolbar1TB3Click(Sender: PControl; BtnID: Integer);
var S : KOLString;
begin
S:=eSnd.Text;
if (S<>"")and(Clnt.Tag=1) then
Clnt.Send(S,Length(S));
end;

end.



Страницы: 1 вся ветка

Текущий архив: 2007.12.02;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.021 c
11-1178992162
Dmitriy___
2007-05-12 21:49
2007.12.02
Collapse и SetItemState


15-1193719649
Separator
2007-10-30 07:47
2007.12.02
Распознование баркодов


15-1193398144
@!!ex
2007-10-26 15:29
2007.12.02
Запрет на смену разрешения экрана.


15-1194168401
savyhinst
2007-11-04 12:26
2007.12.02
Угол по ф.


15-1193766687
@!!ex
2007-10-30 20:51
2007.12.02
где почитать про дебагинг под Delphi