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

Вниз

Третий раз спрашиваю...:(   Найти похожие ветки 

 
Serd_hhc   (2002-04-18 16:01) [0]

Уважаемые мастера,

Как организовать что-то вроде TServerSocket при помощи TWinSock?
Ну хотябы пример на прием данных при помощи TWinSock напишите...

Заранее благодарю ответивших.


 
Wonder   (2002-04-18 16:15) [1]

Что такое TWinSock?


 
Ph.D.Kot   (2002-04-18 17:33) [2]

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


 
Serd_hhc   (2002-04-19 11:14) [3]

Я уже весь сервер "перевернул" - НЕТ ПРИМЕРА!!!


 
Serd_hhc   (2002-04-19 11:31) [4]

Anybody HOME ? 8-<


 
Digitman   (2002-04-19 12:28) [5]

>Serd_hhc

Тебе задан встречный вопрос : что такое TWinSock ?


 
Serd_hhc   (2002-04-24 09:21) [6]

>Digitman
Это Windozer`ский сокет!


 
Song   (2002-04-24 11:23) [7]

Serd_hhc © (24.04.02 09:21)
Нет такого класса.

Сокет называется по другому.


 
Digitman   (2002-04-24 12:38) [8]

>Serd_hhc
Кто такой "Windozer" - тоже остается только догадываться)

Рискну-таки предположить, что "Windozer`ский сокет" - это объект socket в спецификация Winsock от MS, а некий тип TWinSock, соответственно, - хэндл объекта socket в соответствии с этой спецификацией, имеющий тип TSocket (или THandle, что эквивалентно) по определению в модуле Winsock.pas.
Если так, то - опять же - встречные вопросы тебе :

1. Надо понимать, организация сервера на базе объекта класса TServerSocket от Борланда тебе знакома и понятна ?

2. Но TServerSocket тебя чем-то не устраивает тем не менее ? Коль такой вопрос задаешь ? И чем же не устраивает ?

3. Что вот сие означает - "организовать что-то вроде.." ? Ограниченная реализация чего-то конкретного или что ? В каких условиях должно функц-ть это самое "что-то вроде" ? Какие конкретные ф-ции должны выполняться этим "что-то" ? Сколько клиентов планируется у этого "что-то" ? Должно ли "что-то" уметь обрабатывать несколько клиентов одновременно-параллельно или допустима сериализация приема/передачи данных и исполнения клиентских запросов ?


 
Serd_hhc   (2002-04-25 11:47) [9]

1. ДА. Знакома и понятна.

2. TServerSocket меня не устраивает увеличение размера ( в моём случае с 24 КБ до 136 КБ.)

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

Вот и всё.


 
Digitman   (2002-04-25 13:32) [10]

1. Позволь-таки усомниться в этом. См. твой комментарий по п.3.

2. Всего-то навсего - возьми из scktcomp.pas только фрагменты, отногсящиеся к TServerSocket, выкинь оттуда все обращения к TApplication (они, требуя присоединения модуля Forms, и "тянут за собой" те 100 кб, что тебе так мешают), заменив их на эквивал-ную по функц-ти, но упрощенную программную логику. Вот тебе и будет полнокровный TServerSocket предельно возможного малого размера !

3. На открываемом ДЛЯ ПРОСЛУШИВАНИЯ порту никаких данных, кроме кл.запросов на соединение, сервером ничего не принимается - ни текста ни чего-то там еще ... Вместо этого Winsock автоматически при акцептировании очередного кл.запроса на соединение создает отдельное гнездо для клиента, управлением которого и занимается отдельно создаваемый экз-р класса TCustomSocket (совместно с отдельным экз-ром TCustomWinSocket). Задача же объекта TServerSocket, в целом и общем, весьма далека от того, как ты себе это понимаешь. TServerSocket занимается, в 1-ю очередь диспетчеризацией объектов TServerClientWinSocket и генерацией/арбитражем событий, возникающих во всех установленных клиентских соединениях, а так же (в частном случае) - диспетчеризацией и кэшированием создаваемого им же в режиме stThreadBlocking пула кодовых потоков, в контексте каждого из которых и м.б. реализован (тобой же, а не кодом TServerSocket"а) параллельный транспорт клиентских гнездовых соединений.


 
Serd_hhc   (2002-04-25 15:16) [11]

2. Я так и сделал, но размер сохранился (в Делфи 6). Не знаю почему, но в Делфи 5 размер уменьшился (на ~60 КБ.) Но этого мало. Нужно оставить хотябы 30 КБ. 70-80 КБ это много.

3. Что-то ты завернул.... Почти ничего не понял.

П.С. Я пытался выкинуть что побольше из scktcom.pas но там всё на что-то ссылаются, и ничего не получилось.

По возможности, не мог бы ты мне помочь прислав исправленный pas.


 
Digitman   (2002-04-25 17:06) [12]

>Serd_hhc

А откуда он у меня - "исправленный pas" ? Я, видишь ли, такой фигней не занимался никогда, а использовал и использую PASы от Борланда лишь искл-но в кач-ве работающего учебного пособия для собственных, если угодно - нестандартных реализаций, когда этого действительно требует задача. Что называется - "по образу и подобию": если, как часто это бывает, где-то что-то ни черта непонятно - уж лучше Борланда, imho, никто не подскажет)

2. В Д6 - не в курсе. Нет у меня Д6 под рукой. Но предполагаю, что есть еще где-то ссылка на Forms, не явная (как это в scktcomp в Д5), а косвенная, через еще какой-то вспомогательный модуль. Неужели это так сложно выяснить, "погуляв" по цепочке ключевых вызовов, относящихся к процессингу оконных сообщений в контексте класса ? Либо сгенерировав тот же *.map да поглядев на него "через лупу" ?

3. Чего "завернул"-то ? Ты вот не поленись, изучи по тексту scktcomp.pas, что же на самом деле, реально происходит в методе TServerSocket.Open, в какие моменты, при каких условиях и кем возбуждаются события OnAccept(), OnConnect(), OnClientRead/Write() и пр. Может, и вопрос сам собой отпадет тогда, потому как ты увидишь, что то самое ОС-гнездо, что создается при TServerSocket.Open, не принимает участия НИ в операциях чтения НИ в операциях записи. Задача "слушающего" гнезда (по кр.мере - в TServerSocket) - акцептировать либо отвергать запросы новых потенциальных клиентов на "соединение с сервером". Задача же TServerSocket (самая первая и самая важная) - создать такое гнездо. Тем самым, собственно, серверный объект-гнездо (имеется ввиду - обязательно присутствующее у каждого socket-сервера "слушающее" гнездо) и отличается принципиально от клиентского объекта-гнезда (которому "прослушивание" чего-то там совершенно не нужно, которому нужно лишь подключаться/отключаться да принимать/передавать данные)

Примеры же гнездового транспорта без использования каких бы то ни было классов от Борланда я (да и не только я) неоднократно приводил в этом же разделе форума. И не так уж давно. Ищи внимательней.

P.S. Сдается что-то мне : никак "заразу" сетевую ты возжелал сочинить ? Так что ли ? На троян уж больно условия задачи тянут). Вряд ли потянешь с такими познаниями и желанием досконально разобраться в том, что происходит в TSocketServer... Или ошибаюсь ?) Хотелось бы надеяться)... А иначе - на кой черт, спрашивается, (imho, совершенно ведь беспричинно !) отказываться от уже сделанного Борландом ? Ну и что, что полторы-две сотни кБ ? В чем проблема-то ? Машинка слабая ? ресурсов мало ? Так ведь на такой машинке и сервер нет резона разворачивать !)


 
Serd_hhc   (2002-04-25 17:27) [13]

2Digitman

Хоть ты меня и ``поругал``, но всё равно

program SPASIBO;
var
i:integer;
begin
for i:=0 to 1000 do
Writeln(" большое спасибо за уделённое мне время");
Writeln(".");
end;


 
Serd_hhc   (2002-04-25 17:37) [14]

2Digitman
Хоть ты меня и "поругал", но всё равно


program SPASIBO;
var
i:integer;
begin
for i:=0 to 1000 do
Writeln("Большое спасибо за уделённое мне время");
Writeln(".");
end;


 
Slym   (2002-04-26 07:49) [15]

Чем тебе вин апи не нравится, шлюз (сокет2сокет) 26,5кБ


 
Serd_hhc   (2002-04-26 12:10) [16]

2Slim
А по подробнее....


 
andrucco   (2002-04-26 12:47) [17]

Этот пример лежал(ит) где-то на сайте и в нем была ошибка, я ее вроде поправил
так, что должно работать без проблем, сорри за мусор это я баловался но так все понятно, комментарии оригинала сохранены


{комментариев мало, думаю что разберётесь. прога проверялась на 98,
ни разу не глюкнула, но АБСОЛЮТНО корректную работу не гарантирую.
очень много из неё повыдергано, т.е. осталось совсем немного, за
счёт чего ещё более уменьшился размер - оригинальная версия сервера
активно работает с DLL ну и ещё кое-какие прибамбасы содержит, но и
весит на 5 килов поболее... кому надо могу скинуть и её. ну в общем всё. удачи!}
program Small_socket_server;
{$M 16384,2097152}
uses
Windows,
Winsock,
SysUtils;

const
nport:smallint = 500;//порт - любой (я взял 500-й)
var
WSAData:TWSAData;
MySockAddr:sockaddr_in;
descriptor,srvsocket:TSocket;
res,thread_id:cardinal;
type MyPChar = array [0..255] of Char;
threadvar //тут переменные для потока
ColBytes: Cardinal;
thread_buffer: MyPChar;
_wsaerror,rcvd_bytes:Cardinal;
answer: MyPChar;
threadsocket:TSocket;

var F: Text;
procedure WriteS(S: PChar);
var n: integer;
begin
AssignFile(F, "logs.txt");
{$I-}
Append(F);
{$I+}
if IOResult <> 0 then ReWrite(F);
{ for n := 1 to rcvd_bytes do
Write(F,S[n-1]);
Writeln(F);
}
Writeln(F,S);
Close(F);
end;

procedure InitializeSrvSocket;
begin
res:=WSAStartup($0101,WSAData);
if res<>0 then Halt;
MySockAddr.sin_addr.S_addr:=INADDR_ANY;
MySockAddr.sin_port:=htons(nport);
MySockAddr.sin_family:=AF_INET;//это семейство протоколов кажется. их много...
descriptor:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//пытаемся создать сокет - если он уже есть
//на данном порту - закрываемся
if descriptor=INVALID_SOCKET then Halt;
res:=bind(descriptor,MySockAddr,SizeOf(MySockAddr));
if res<>0 then Halt;
res:=listen(descriptor,SOMAXCONN);//SOMAXCONN - это вроде 5 клиентов максимум? поправьте если ошибаюсь
if res<>0 then Halt;
//при инициализации сокета никаких ошибок не выдаётся, что разумеется легко поправимо (если надо)
end;

procedure ThreadExecProc; //процедура потока
type MyCharArray = array [0..255] of Char;
RIOpenComm = record
FunNum: Byte;
InQueue: Word;
OutQueue: Word;
Size: Word;
ComName: MyCharArray;
end;
var OpenC: RIOpenComm;
NotRead: Boolean;
P: MyCharArray;
PCS: PChar;
POpenC : ^RIOpenComm;
V: OleVariant;
SS: AnsiString;
begin
threadsocket:= srvsocket;
// answer:="Соединено"+Chr(13)+Chr(10); //мессага клиенту
answer:="Connected"+Chr(13)+Chr(10); //мессага клиенту

send(threadsocket,answer,Length(answer),0); //отправляем ответ клиенту что усё ОК

while true do begin //поток выполняется пока не произойдёт дисконнект
thread_buffer:=""; //чистим буфер
{ ColBytes := StrLen(answer);}

rcvd_bytes:=recv(threadsocket,thread_buffer,Length(thread_buffer),0); //ждём данных от клиента - строку
// тут всё просто либо мы получаем данные, либо rcvd_bytes=0 (нормальный дисконнект) либо фатальный дисконнект -
//тогда смотрим код последней ошибки
_wsaerror:=WSAGetLastError; //тут мы его (код ошибки) и проверяем...
if (rcvd_bytes=0) or (_wsaerror=WSAECONNRESET) then begin //обрабатываем дисконнект
MessageBeep(0);
closesocket(threadsocket); //закрываем сокет
ExitThread(0); //выходим из потока
end;

// MessageBeep(0);
// answer:="Соединено"+Chr(13)+Chr(10); //мессага клиенту
Inc(Colbytes, 10);
SS := "Weigth = " + (IntToStr(ColBytes))+Chr(13)+Chr(10);
StrCopy(answer, PChar(ss));

send(threadsocket,answer,StrLen(answer),0); //отправляем ответ клиенту что усё ОК

// send(threadsocket,thread_buffer,Length(answer),0);
//# WriteS(thread_buffer);

// MessageBeep(0);

end; //end while

end;

begin
InitializeSrvSocket; //инициализируем сокет
while true do begin //крутим цикл
srvsocket:=accept(descriptor,nil,nil); //ждём соединения. именно просто ЖДЁМ - не жрём ресурсов проца
//(или по минимуму - таскинфо у меня показывал либо 0 либо 0.01% загрузки проца)
if srvsocket<>INVALID_SOCKET then begin //если всё успешно, то создаём поток для клиента
CreateThread(nil,0,@ThreadExecProc,nil,0,thread_id);
//далее ОТДЕЛЬНЫЙ поток работает с ОТДЕЛЬНЫМ клиентом, а прога снова ждёт коннекта другого клиента...
end;
end;
end.
//вот так вот. разве сложно?


 
Serd_hhc   (2002-04-26 18:11) [18]

Супер-пупер-мега рулез!!!!! Спасибо великое с поклоном в ноги :)



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

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

Наверх





Память: 0.51 MB
Время: 0.014 c
7-23801
KarlovAF
2002-04-12 05:26
2002.07.08
Delphi5 and WinNT Terminal Server...


4-23831
Web
2002-05-09 23:23
2002.07.08
WinAPI


7-23807
Dizer
2002-04-16 11:05
2002.07.08
Интерфейс RS-485


1-23545
Дельфятник
2002-06-26 17:37
2002.07.08
Access Violation при работе с TComboBox.


1-23553
Navigor
2002-06-26 19:02
2002.07.08
Про буфер обмена WIN 98





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