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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2011, 21:14   #1
dance0ff
Пользователь
 
Аватар для dance0ff
 
Регистрация: 04.09.2008
Сообщений: 12
По умолчанию WinSock асинхронный режим FD_ACCEPT и Accept

Ребят, доброый вечер.
Пишу клиент-сервер на неблокирующих сокетах. Ну не суть какой клиент а сервер неблокирующий. Значит вооот.

Код:
WSAAsyncSelect(ServerSocket,FWndHandle,WM_SocketEvent,
FD_READ or FD_ACCEPT or FD_CLOSE);
Сообщения приходят как и ожадал, всё в порядке. Однако, по приходу сообщения FD_ACCEPT, мне надо поверить количество клиентов и разрешить или запретить этот самый ACCEPT. Как мне это сделать?

То есть событие возникает уже после фактического ACCEPT.

Делал вот так:
Код:
Procedure TServerClass.WMSocketEvent(var MSG:TMessage);
var
SOCK:TSocket;
ErrorCode:integer;
SockInfo:TSockAddr;

abuf:array of char;
vbuf:string;
vsize:integer;
bufsize:integer;
IP:string;
begin
SOCK:=TSocket(MSG.WParam);
vsize:=SizeOf(TSockAddr);
GetPeerName(SOCK,SockInfo,vsize);
IP:=inet_ntoa(SockInfo.sin_addr);
ErrorCode:=WSAGetSelectError(MSG.LParam);

if ErrorCode<>0 then
 begin
 CloseSocket(SOCK);
 exit;
 end;


CASE WSAGetSelectEvent(MSG.LParam) OF
 FD_ACCEPT:
  begin //Only on SERVER_SOCKET
//ВОТ здесь значит. Проверяю, если больше 6 то не надо пускать
//Однако как мы знаем, FD_ACCEPT срабатывает только на серврном сокет
//поэтому CloseSocket(SOCK)  у меня закрывается серверный скет полностью
   IF ACTIVECLIENTS<6 then
     begin
     ACCEPT(SOCK,nil,nil);
      Inc(ActiveClients,1);
     end else CLOSESOCKET(SOCK); //Закрывает сам сервер
  end;

 FD_CLOSE:
  begin
  ActiveClients:=ActiveClients-1;
  Shutdown(SOCK,SD_SEND);
  CloseSocket(SOCK);
  end;

 FD_READ:
  begin
  //RECV data
  end;
 end;
end;
-----
Вот прошу помочь. Надо запретить подключение клиентов, если на сервере уже больше 6 клиентов.

Последний раз редактировалось dance0ff; 28.04.2011 в 22:03.
dance0ff вне форума Ответить с цитированием
Старый 29.04.2011, 02:16   #2
dance0ff
Пользователь
 
Аватар для dance0ff
 
Регистрация: 04.09.2008
Сообщений: 12
По умолчанию

Всё разобрался.
Вот как было:
Код:
CASE WSAGetSelectEvent(MSG.LParam) OF
 FD_ACCEPT:
  begin //Only on SERVER_SOCKET
//ВОТ здесь значит. Проверяю, если больше 6 то не надо пускать
//Однако как мы знаем, FD_ACCEPT срабатывает только на серврном сокет
//поэтому CloseSocket(SOCK)  у меня закрывается серверный скет полностью
   IF ACTIVECLIENTS<6 then
     begin
     ACCEPT(SOCK,nil,nil);
      Inc(ActiveClients,1);
     end else CLOSESOCKET(SOCK); //Закрывает сам сервер
  end;
Вот как надо:
Код:
CASE WSAGetSelectEvent(MSG.LParam) OF

 FD_ACCEPT:
  begin //Only on SERVER_SOCKET

     S1:=ACCEPT(SOCK,nil,nil);
     if ActiveClients>6 then 
      begin
      ShutDown(S1,SD_SEND);
      CloseSocket(S1);
      exit; 
      end;

      Inc(ActiveClients,1);
  end;

Последний раз редактировалось dance0ff; 29.04.2011 в 02:16. Причина: косяк
dance0ff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Асинхронный режим работы в WinSock ImmortalAlexSan Работа с сетью в Delphi 2 28.04.2011 22:19
Асинхронный вызов в C# q_proger C# (си шарп) 7 16.12.2010 23:27
В отдельном потоке после ф-ции accept() ничего не выполняется!!! Fissa Общие вопросы .NET 7 25.05.2010 16:23
Асинхронный просмотр Claster Помощь студентам 6 11.02.2010 15:38
Асинхронный сокет raspberry C/C++ Сетевое программирование 8 07.07.2009 16:51