Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Вниз

TTcpServer без формы. Почему не работает?   Найти похожие ветки 

 
Gym   (2003-11-01 13:54) [0]

Привет.
Посмотрите пожалуйста программку. Почему не работает?
Вернее работает но не ло конца.
Законектиться на 127.0.0.1 7777 можно (пробовал телнетом)
можно отсылать что угодно, но ResiveLn ничего не возвращает.
Что не так?

program serv;
uses
Sockets,
Windows;
var
Serv : TTcpServer;
Str : string;
begin
Serv:= TTCPServer.Create(nil);
Serv.LocalHost:="127.0.0.1";
Serv.LocalPort:="7777";
Serv.Active:=true;
while not(str="quit") do
begin
Str:=Serv.Receiveln();
if str<>"" then MessageBox(0,PChar(Str),"Принята строка",MB_OK);
end;
Serv.Active:=false;
Serv.Free;
end.


 
Digitman   (2003-11-01 14:02) [1]

1. Нет цикла ожидания/выборки/диспетчеризации оконных сообщений.
2. Сообщение какого конкретно клиента ты ожидаешь получить вызовом Serv.Receiveln ? У сервера м.б. более одного активных клиентов
3. При чем здесь форма ?


 
Gym   (2003-11-01 14:11) [2]

1. А как этот цикл организовать если учесть что у программы нет окна ( формы)?
2. В качестве клиента я использовал телнет

C:\telnet 127.0.0.1 7777

3. В приложении нет окна (формы) и в связи с этим возникают некоторые затруднения.


 
Digitman   (2003-11-01 14:21) [3]


> 1. А как этот цикл организовать если учесть что у программы
> нет окна ( формы)?


см. GetMessage(), TranslateMessage(), DispatchMessage()


> 2. В качестве клиента я использовал телнет


а если одновременно косой десяток таких "телнетов" подключатся ?


> 3. В приложении нет окна (формы) и в связи с этим возникают
> некоторые затруднения.


А зачем ты ее выкинул, форму-то ? Верни на место и просто сделай ее невидимой, коль мешает сильно ...всех делов)


 
Gym   (2003-11-02 15:55) [4]

Digitman а ты не мог бы привести пример кода той же проги тока чтоб правильно всё было?
Насчёт десятка телнетов... пусть хотя бы с одним заработает, а там подумаем :)
Форму выкинул в кчестве эксперемента, хочу научиться с компонентами без формы работать.
И потом даже невидимая форма, в NT висит в таскбаре (поправти меня если я неправ).


 
Anatoly Podgoretsky   (2003-11-02 15:58) [5]

Правильно форма не нужна, а вот окно с обработчиком очереди сообщений не помешает.


 
Gym   (2003-11-02 16:36) [6]

>Anatoly Podgoretsky
А нельзя ли хотя бы кусочек кода посмотреть?
А то словосочетание "окно с обработчиком очереди сообщений" воспринемается мной как то туманно.
И потом пример то неработает...


 
Gym   (2003-11-02 18:37) [7]

Если не трудно покажите кусок рабочей проги похожей по смыслу на описанный выше пример или исправте этот.
Спасибо.


 
SammIk   (2003-11-02 19:01) [8]

А в 2000 и хр лучше CreateIoCompletionPor
нету)
И компанентами не надо пользоваться)


 
SammIk   (2003-11-02 19:02) [9]

CreateIoCompletionPor лучне WSAAsinSelect


 
Gym   (2003-11-02 19:12) [10]

>>SammIk
CreateIoCompletionPor это что API функция?
Почитаю конечно, но всё же хотелось бы получить ответ
на мой вопрос...


 
Polevi   (2003-11-02 21:15) [11]

>SammIk © (02.11.03 19:02) [9]
WSARecv, WSASend лучше использовать с процедурой завершения (APC) - будет работать на всех виндах с winsock2, Completion Ports не совсем хороши для сокетов

>Gym © (02.11.03 19:12) [10]

program Project1;
{$APPTYPE CONSOLE}
uses SysUtils, Windows;

var
Msg:TMsg;
begin
// Insert user code here
while GetMessage(msg,0,0,0) do DispatchMessage(msg);
end.


 
Gym   (2003-11-03 10:15) [12]

>>Polevi

Всё равно не работает. После конекта с клиентом, сервер тут
же обрывает связь. Свойство Serv.Accept устанавливается в
true, но функция Serv.ResiveLn() попрежнему ничего не
возвращает.
В чём проблемма а? :(


 
Digitman   (2003-11-03 10:28) [13]


> Свойство Serv.Accept устанавливается в
> true


что это за св-во такое ? может все-таки Active ?


> функция Serv.ResiveLn() попрежнему ничего не
> возвращает


а если бы и возвратила, и более чем один клиент в этот момент был подключен к серверу, КАК ты собрался определять, кто из клиентов послал серверу только что полученную строку ?


 
Polevi   (2003-11-03 10:28) [14]

обработка ошибок что говорит


 
Gym   (2003-11-03 11:01) [15]

to Digitman

>>что это за св-во такое ? может все-таки Active ?

Ты прав, это не свойство, это функция, метод всмысле
Serv.Accept : boolean. Приношу извинения за неточность.

>>а если бы и возвратила, и более чем один клиент в этот
момент был подключен к серверу, КАК ты собрался определять,
кто из клиентов послал серверу только что полученную строку ?

Вот когда возвратит там и разберусь, а вообще я больше одного
клиента не планирую.

to Polevi

>>обработка ошибок что говорит

а нет никаких ошибок. Всё компилируется и исполняется нормально.
Сокет открывается, я к нему конекчусь телнетом. Телнет говорит
connecting to 127.0.0.1 ...
Connection established
и сразу же
Session closed
Может откомпилируешь и посмотришь?
Если конечно есть время и не лень :) ...

program serv;
uses
Sockets,
Windows;
var
Serv1 : TTcpServer;
Str : string;
Msg : TMsg;
procedure Accepted(Sender:TObject);
begin
writeln("www");
end;
begin
Serv1:= TTCPServer.Create(nil);
Serv1.LocalHost:="127.0.0.1";
Serv1.LocalPort:="7777";
Serv1.Active:=true;
Serv1.WaitForConnection;
while not(str="quit") do
begin
Str:=Serv1.Receiveln(#$D#$A);
if Serv1.Accept then MessageBox(0,PChar(Str),"Accept",MB_OK);
if str<>"" then MessageBox(0,PChar(Str),"


 
Digitman   (2003-11-03 11:16) [16]


> Вот когда возвратит


ну-ну)... продолжай мучить "слушающее" гнездо)...
а вникать в суть метода Accept, конечно же, Пушкин должен, не ты)


 
Gym   (2003-11-03 11:29) [17]

to Digitman
Ну Пушкин он ваще мужик умный был...
Я в хелпах про Accept прочитал:
Accept вызывается автоматически на запрос о конекте от
клиентского сокета.
Но вообще там не очень подробно написано, так что если
ты мне откроешь глаза на суть этого метода буду признателен ;)


 
Digitman   (2003-11-03 11:36) [18]


> Accept вызывается автоматически на запрос о конекте от
> клиентского сокета.


вот именно) ... какого ж шута ты явно его вызываешь ?)


> откроешь глаза на суть этого метода


дался он тебе ! оставь его в покое)

обрати лучше свой взор на события компонента !

назначай обработчики нужным событиям, и после Serv1.Active := True выполняй цикл, указанный <Polevi>... все остальное за тебя сделает компонент, твоя же задача - обрабатывать эти асинхронные события, в ходе которых читать/писать данные из/в КОНКРЕТНОЕ активное соединение)


 
Gym   (2003-11-03 12:12) [19]

to Digitman
>> обрати лучше свой взор на события компонента !
:)))
Я сначала как раз на них и обратил свой взор,
Но столкнулся с проблеммой следующего характера:
У меня нет формы и нет инспектора обьектов в котоом можно
щелкнуть парураз на нужномсобытии и заголовок обработчика
создастся автоматически. Поэтому я начал с того чтонаписал
простую процедуру типа

procedure Accepted(Sender:TObject);
begin
writeln("www");
end;

И попытался присвоить её имя в Serv1.OnAccept:=Accepted(nil);
естетвенно у меня ничего не вышло я ещё попробовал вот так
Serv1.OnAccept:=@Accepted(nil); :))) и полез в хелп.
Там я прочитал что в OnAccegn нужно засовывать хендлер сокета,
процедура должна быть типа TSocketAcceptEvent и куча всего ещё.
И я решил что проще попробовать написать то что написано выше
и поприставать с глупыми вопросами к умным дядькам на форуме
:))) Прошу не судите строго. Уж больно там всё запутанно
написано про этот TSocketAcceptEvent. Если разяснишь, и лучше
на примере то я тебя буду считать самым умным дядькой на этом
форуме. ;)


 
SammIk   (2003-11-03 12:38) [20]

2 Polevi ©
Мелко мягкии советует использовать ипенно порты
скорость обработки увеличивается и еще...
Но главное аграничение это 2000 и хр и 2003((
На 9х и ме такои дури нет))
Но вообще это дело выбора)


 
Zelius   (2003-11-03 12:48) [21]

А может обратить свой взор на TidTcpServer из Indy? Этот компонент вроде бы не нуждается в очереди сообщений.


 
Gym   (2003-11-03 16:05) [22]

А можно поподробней об очереди сообщений?
У меня не слишком богатый опыт в програмировании
на API может от этого все неприятности?



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

Форум: "Сети";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.01 c
1-11985
Serguar
2003-12-19 10:55
2004.01.05
не работают вставки с ассемблерным кодом


14-12107
Undert
2003-12-15 00:28
2004.01.05
Кто что знает про Хаффмана ? (Huffman)


14-12087
OlegGashev
2003-12-15 02:32
2004.01.05
МОЙ ПРОШЕДШИЙ ГОД


7-12175
Grab
2003-09-22 22:15
2004.01.05
Как усыпить ПК под Windows NT/2000/XP?


9-11757
Yanis
2003-06-07 11:39
2004.01.05
Хочу спросить про рисование на экране.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский