Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 227

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Как сделать мультипоточность с сервером, чтобы клиент открывал множество соединений для звязи с одним портом сервера + в интерфейсе программы клиента должна быть настройка выбора Thread число соединений и start, stop.

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Winsock2, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
  7.  
  8. type
  9. TForm1 = class(TForm)
  10. private
  11. { Private declarations }
  12. public
  13. { Public declarations }
  14. end;
  15.  
  16. var
  17. Form1: TForm1;
  18.  
  19. implementation
  20.  
  21. {$R *.dfm}
  22.  
  23.  
  24. var Server:TInaddr;
  25. inf: TWSADATA;
  26. socks: integer;
  27. sockaddr: TSockAddr;
  28. s: array[0..100] of Char;
  29.  
  30. begin
  31. Server.s_addr:=inet_addr(PChar('127.0.0.1'));
  32. WSAStartup(MAKEWORD(2,0),inf);
  33. socks:=socket(AF_INET,SOCK_STREAM,0);
  34. sockaddr.sin_family := AF_INET;
  35. sockaddr.sin_port := htons(210);
  36. sockaddr.sin_addr := Server;
  37. connect(socks,@sockaddr,sizeof(sockaddr));
  38. begin s:='Hello';
  39. if connect(socks,@sockaddr,sizeof(sockaddr))<>-1 then
  40. begin
  41. send(socks,s,Length(s),0);
  42. end;
  43.  
  44. end;
  45. end.
  46.  
  47.  


Father Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Father (статус: Посетитель)
Вопрос отправлен: 26 апреля 2011, 08:32
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Father!
Есть много вариантов, как написать подобный сервер. Если клиентов будет немного (несколько сотен одновременно, все зависит от настроек) и они будут в основном "тяжелые", то лучше использовать методику "один клиент-один тред" (кстати, так работает Apache). Почитать о примере использования можно тут http://www.realcoding.net/articles/programmirovanie-soketov-v-delphi-s-ispolzovaniem-windows-socket-api.html
Если же клиентов будет много (но не более 1024 подключившихся одновременно), то можно использовать select и все сделать в одном треде. Либо сделать несколько рабочих тредов и распределять между ними. Если же клиентов будет больше (я все ещё говорю об одновременных подключениях) - то лучше смотреть в сторону Poll и IOCP.
Посмотрите пример, погуглите на тему select и poll, а там будет понятнее, что хочется. А может просто использовать IdTCPServer, который уже сам создает по треду на каждое подключение и вполне может реализовать все Ваши желания.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 26 апреля 2011, 10:47


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:57
Выполнено за 0.03 сек.