![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание простешего сокетного сервера! Помомгите начинающему!
Alexey8000 © (2004-05-10 20:16:00)Как создать такой сервер который например ожидет прихода 5 символов от клиента и потом "выплескивает" клиенту какую то соответсвующую информацию исходя из полученных данных?
Не поможите? Я не много просто запутался с блочно/неблочным примемом данных. Просто может много клиентов конектиться, а мне надо всех корректно обслужить. Помогите примером для подобной задачи! Заранее ОЧЕНЬ благодарен!!
Rouse_ (2004-05-15 21:16:00) [1]Принимаешь 5 байт остальные не учитываешь - заставить можно только если сам шлешь, иначе принудительно начинаешь искать себе на голову геморрой - ибо (если я правильно понял) сервер без знаний азов писать не стоит...
Alexey8000 (2004-05-15 17:34:00) [2]А как например только 5 символов заставить сервер принимать а остальное отсекать как мусор? ну соответсвенно м.б. много клиентов что конектяться и со всеми соответственно разбираться.
А если делать это посимвольно используя OnRead и OnWrite то как?
Rouse_ (2004-05-13 09:08:00) [3]> [17] Verg © (13.05.04 06:23)
Опс, действительно :))
Verg (2004-05-13 06:23:00) [4]
> [15] Rouse_ © (12.05.04 22:31)
> > [14] Verg © (12.05.04 22:08)
> Попросту иногда у меня были ситуации когда recv с таким
> буфером возвращала WSAEMSGSIZE
Это при SOCK_STREAM-то?
Rouse_ (2004-05-12 22:33:00) [5]или WSAENOBUFS на Send
Rouse_ (2004-05-12 22:31:00) [6]> [14] Verg © (12.05.04 22:08)
Попросту иногда у меня были ситуации когда recv с таким буфером возвращала WSAEMSGSIZE
Verg (2004-05-12 22:08:00) [7]
> [12] Rouse_ © (12.05.04 22:03)
> Я про размер пакета...
> Rcvd := ReceiveBuf(Buffer, Min(FDescriptor.Size, sizeof(Buffer))
> );
> просто не отработает правильно (точнее может отработать
> неправильно...)
Например?
Что значит "неправильно"? Почему?
Что именно ты имеешь ввиду?
Не куда, неправильно?
Verg (2004-05-12 22:03:00) [8]Вообще, это "запас", просто. Никто там и не думал заставлять кого-то там принимать порции по 65к каждый раз, но при очень интенсивном обмене гиганского объема файлами при очень высокой произ-ти сетки наблюдалось существенное "улучшение временных показателей" при приближении размеров приемного буфера к этой величине (видимо к величние реального приемного буфера Winsock-SOCK_STREAM), по сравнению с другим спосбами увеличения произ-ти на асинхронных-оконных сокетах.
Rouse_ (2004-05-12 22:03:00) [9]Я про размер пакета...
Rcvd := ReceiveBuf(Buffer, Min(FDescriptor.Size, sizeof(Buffer)) );
просто не отработает правильно (точнее может отработать неправильно...)
Verg (2004-05-12 21:49:00) [10]
> [10] Rouse_ © (12.05.04 21:47)
> > [9] Verg © (12.05.04 21:38)
> Я не про это вел речь - а о невозможности приема такого
> объема целиком в некоторых (но часто встречавшихся в моей
> практике) случаях...
Хм..., извини, не очень понимаю о чем речь.
Rouse_ (2004-05-12 21:47:00) [11]> [9] Verg © (12.05.04 21:38)
Я не про это вел речь - а о невозможности приема такого объема целиком в некоторых (но часто встречавшихся в моей практике) случаях...
Verg (2004-05-12 21:38:00) [12]
> [8] Rouse_ © (12.05.04 21:35)
По производительности принимающей сторны - процентов 20% дает по стравнени. с методом "вычерпывай все в OnRead".
Rouse_ (2004-05-12 21:35:00) [13]> [7] Verg © (12.05.04 21:04)
BUFF_SIZE = 65536; // Размер приемного буфера
ИМХО, не слишком оправдано...
Verg (2004-05-12 21:04:00) [14]Про асинхронный режим сокетов, в смысле TClient(Server)Socket и передачу файлов можешь посмотреть http://webfile.ru/6840
Alexey8000 (2004-05-12 20:07:00) [15]to Polevi...
так если stThreadBlocking использовать то в каком обработчике событий компонента ServerSocket просматривать то ReceiveText и WriteText? Ведь OnRead и OnWrite тут уже не работают.
хелп (2004-05-11 23:47:00) [16]См в инди commandhandiers.
Polevi (2004-05-11 22:51:00) [17]там тоже самое, вместо ReadLn и WriteLn - ReceiveText и WriteText
и stThreadBlocking режим установить
Alexey8000 (2004-05-11 19:14:00) [18]А спомощью не Инди, а КлиентСокет и СерверСокет? можно?
А в примерах что в демосе, там непонять как вот именно блочный вариант прогнать, чтоб 5 символов взять первых и поанализировать их и в ответ выбросить что либо на основании анализа.
Не поможите?
хелп (2004-05-11 08:54:00) [19]Юзай компоненты "инди"
для клиента:
procedure TForm1.Button1Click(Sender: TObject);
var
a: string;
begin
idtcpclient1.Connect;
idtcpclient1.WriteLn('ля ля ля');
idtcpclient1.ReadLn(a)
end;
для сервера:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
a: string;
begin
AThread.Connection.ReadLn(a)
AThread.Connection.WriteLn('cool');
end;
VMcL (2004-05-10 21:21:00) [20]>>Alexey8000 (10.05.04 20:16)
Delphi?\Demos\Internet\Chat
Delphi?\Demos\Internet\NetChat