Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2010, 21:36   #1
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию Каждому клиенту по потоку.

Ребят, на серверной части требуется обрабатывать данные от клиентов, каждые в отдельном потоке, который создается, как только клиент подключился. Вот мой код:
Код:
procedure execute (var msg:TMessage);
Var
ClientAddr:TSockAddr;
ClientSock:TSocket;
Data:TLogData; //тип record
buf:string;
size:integer;
begin
ClientSock:=Tsocket(Sock);
If getpeername(ClientSock,ClientAddr,Len)<>SOCKET_ERROR then
begin
Data.IP:=inet_ntoa(ClientAddr.sin_addr);
Data.Port:=ntohs(ClientAddr.sin_port);
Form1.ListBox1.Items.Add(Data.IP);
end;
If msg.lparam=0 then
begin
setlength(buf,1024);
recvfrom(Sock,pointer(buf)^,length(buf),0,ClientAddr,size);
Form1.Listbox1.Items.Add(buf);
end;
end;

procedure TForm1.TakeMsg(var m:Tmessage);
Var
buf:string;
size:integer;
begin
Sock:=TSocket(m.WParam);
SockError:=WSAGetSelectError(m.LParam);
If SockError<>0 then
begin
closesocket(Sock);
Exit;
end;
Case WSAGetSelectEvent(m.LParam) of
FD_ACCEPT:
begin
accept(Sock,@ConnectAddr,@Len);
ClTh:=CreateThread(nil,0,@execute,nil,0,ClThID);
SetThreadPriority(ClTh,THREAD_PRIORITY_IDLE);
end;
FD_READ:
begin
SendMessage(ClTh,WM_THREAD,0,0); //ClTh:Handle
end;
end;
end;
Как вы поляли асинхронность достигается путем отправки сообщений окну, если что-то было сделано с сокетом. А вот теперь вопрос: Как мне организовать работу сервера с несколькими клиентами каждый в своем потоке. Покритикуйте неправильные части кода и если можно, предложите алгоритм создания потока и закрепления его за клиентом. И как в определенный поток передать информацию, которая поступила от клиента, привязанного к потоку? Вобщем вопросов много, надо разбираться.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 01.07.2010, 17:45   #2
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Как мне перехватить FD_READ своим потоком? И как привязать вновь созданный поток к клиентскому сокету?
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавить прогрессбар к потоку(поток в отдельном модуле, без формы) Человек_Борща Общие вопросы Delphi 2 21.05.2010 22:00
Подключение к видео потоку из Интернета.. prizrak1390 Работа с сетью в Delphi 7 12.07.2008 21:47
Передать файл клиенту BlackOmen JavaScript, Ajax 7 26.06.2008 11:36
Ответ клиенту... prizrak1390 Работа с сетью в Delphi 8 22.05.2008 11:34
Передача команд серверу и клиенту OrdJONY Работа с сетью в Delphi 9 28.08.2007 10:51