Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Падает сокет усервера на WinAPI - не могу разобраться   Найти похожие ветки 

 
_koha   (2008-08-15 17:40) [0]

Решил сотворить сервер на чистом API для нового троянца без использования классов, но почему то работает один поток, акцепт проходит удачно запускается первый поток, но как только запускается второй поток сокет первого потока уходит в SOCKET_ERROR, После запуска третьего потока сокет второго потока уходит в SOCKET_ERROR и так далее. В чем причина не могу понять вроде все правильно делал.

Вот модуль не весь и недоделанный с исправлениями:

unit TCP;

interface
Uses Windows, SysUtils, WinSock, SockErr, MsgLog;

Type
 PClientRec = ^TClientRec;
 TClientRec = Record
   TCPThrId   : LongWord;
   ClientNum  : Integer;
 end;

  PClientInfo = ^TClientInfo;
  TClientInfo = Record
    ClientSocket : TSocket;
    ClientAddr   : sockaddr_in;
    hClientThr   : THandle;
    ClientThrId  : Integer;
    ClientNum    : Integer;
  end;

TClieitInfoArray  = Array of TClientInfo;

 PAcceptRec = ^TAcceptRec;
 TAcceptRec = Record
   Var SockListen    : TSocket;
   Var ClientInfoArr : TClieitInfoArray;
 end;

Type TThrCmd = (TC_READ, TC_WRITE, TC_STOP, TC_ERROR);

Function StartTCPServer(Port: Integer): Boolean;
Function StopTCPServer: Boolean;
Procedure TCPThreadProc(Param: Pointer);
Procedure TCPClientThreadProc(Param: Pointer);
Procedure AcceptProc(Param: Pointer);

Var
 ThrCount   : Integer;
 AtrId      : LongWord;
 ReadProcId : LongWord;
 WriteProcId: LongWord;
 TCPThreadId: LongWord;
 ClientThrId: LongWord;
 WData      : TWSAData;
 SockListen : TSocket;
 LocalAddr  : sockaddr_in;
 AcceptRec  : TAcceptRec;
 hProc      : THandle;

 hTCPThread : Thandle;
 hClientThr : THandle;

 hThrArray        : Array[1..MAXIMUM_WAIT_OBJECTS] of Thandle;
 ClieitInfoArray  : TClieitInfoArray;
 MultipleThrArray : Array[1..MAXIMUM_WAIT_OBJECTS] of Thandle;

Const
 NET_MESSAGE = WM_USER+1;

implementation

Function StartTCPServer(Port: Integer): Boolean;
Var
 Err: Integer;
begin
 Result := True;

 if Not WSAStartup(MakeWord(1,1),WData) = 0 then begin
   SendDebugMsg("Err: (WSAStartup <> 0) WSAGetLastError: "+SockErrToStr(WSAGetLastError));
   Result := false;
   Exit;
 end;

 SockListen := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 if SockListen = INVALID_SOCKET then begin
   SendDebugMsg("Error: Socket > WSAGetLastError: "+SockErrToStr(WSAGetLastError));
   Result := false;
   Exit;
 end;

 LocalAddr.sin_addr.S_addr := htonl(INADDR_ANY);
 LocalAddr.sin_family      := AF_INET;
 LocalAddr.sin_port        := htons(Port);

 if bind(SockListen, LocalAddr, sizeOf(LocalAddr)) = SOCKET_ERROR then begin
   SendDebugMsg("WSAGetLastError: "+SockErrToStr(WSAGetLastError));
   Result := false;
   Exit;
 end;

 if Listen(SockListen,MAXIMUM_WAIT_OBJECTS) = SOCKET_ERROR then begin
   SendDebugMsg("Listen GetLastError: " + SockErrToStr(WSAGetLastError));
   Result := false;
   Exit;
 end;

 hTCPThread := BeginThread(Nil,0, Addr(TCPThreadProc), 0,0, TCPThreadId);
 if hTCPThread = 0 then begin
   SendDebugMsg("Error: hTCPThread = 0 GetLastError: "+IntToStr(GetLastError));
   Result := False;
   Exit;
 end;

end;
{------------------------------- StopTCPServer --------------------------------}
Function StopTCPServer: Boolean;
begin
 //
end;
{-------------------------------- TCPThreadProc -------------------------------}
Procedure TCPThreadProc(Param: Pointer);
Var
 Msg: TMsg;
begin
 ThrCount := 0;
 FillChar(AcceptRec,SizeOf(AcceptRec),#0);
 AcceptRec.SockListen    := SockListen;
 AcceptRec.ClientInfoArr := ClieitInfoArray;

 hProc:=BeginThread(Nil,0,Addr(AcceptProc),Addr(AcceptRec),0,AtrId);
 if hProc = 0 then begin
   SendDebugMsg("Error: hProc = 0 GetLastError: "+IntToStr(GetLastError));
   Exit;
 end;

 While true do begin

   if PeekMessage(Msg,hTCPThread, WM_NULL, WM_APP, PM_NOREMOVE) then begin
     GetMessage(Msg, 0, 0, 0);
     DispatchMessage(msg);
     Case TThrCmd(MSG.wParam) of
       TC_READ  : SendDebugMsg("MSG.wParam = TC_READ "+PChar(MSG.lParam));
       TC_WRITE : SendDebugMsg("MSG.wParam = TC_WRITE");
       TC_STOP  : SendDebugMsg("MSG.wParam = TC_STOP");
     end;
   end;

   Sleep(50);
 end;

 SendDebugMsg("TCPThreadProc = End");

end;

Procedure TCPClientThreadProc(Param: Pointer);
Var
 MSG        : TMsg;
 Err        : Integer;
 BuffSize   : Integer;
 Num        : Integer;
 Buff : Array[1..1024] of Char;
 Command    : String;
begin
 Num:=PClientInfo(Param)^.ClientNum;
 BuffSize:=1024;

 While True do begin

   FillChar(Buff, BuffSize, 0);

   Err := Recv(PClientInfo(Param)^.ClientSocket, Buff, BuffSize, 0);
   SendDebugMsg("Err: "+SockErrToStr(Err));
   if Err = SOCKET_ERROR then begin
     SendDebugMsg(IntToStr(Num)+" Err = "+SockErrToStr(Err));
     SendDebugMsg(IntToStr(Num)+" Error: TCPClientThreadProc Recv = "+SockErrToStr(WSAGetLastError));
     PostThreadMessage(TCPThreadId, NET_MESSAGE, Integer(TC_ERROR), 0);
     Exit;
   end;

   Command := StrPas(PChar(@Buff));
   if Command = "" then  begin
     CloseSocket(PClientInfo(Param)^.ClientSocket);
     Exit;
   end;
   SendDebugMsg("ComStr = "+IntToStr(Length(Command)));

   /////////////////////////////////////////////////////
   // Command section
   /////////////////////////////////////////////////////

 end;

end;

{--------------------------------- AcceptProc ---------------------------------}
Procedure AcceptProc(Param: Pointer);
Var
 Size: Integer;
 Conf: PAcceptRec;
 ClientSock: TSocket;
 ClientAddr: SockAddr_in;
 ClientInfo: PClientInfo;
 Num       : Integer;
begin

 While True do begin

   New(ClientInfo);
   FillChar(ClientInfo^,SizeOf(TClientInfo), 0);

   Size       := SizeOf(ClientAddr);
   ClientSock := accept(PAcceptRec(Param).SockListen,@ClientAddr, @Size);
   if ClientSock = INVALID_SOCKET then begin
     SendDebugMsg("Error: accept ClientSock WSAGetLastError: " + SockErrToStr(WSAGetLastError));
     PostThreadMessage(TCPThreadId,NET_MESSAGE,Integer(TC_ERROR),0);
     CloseSocket(ClientSock);
     Dispose(ClientInfo);
     Continue;
   end;

   Num := Length(ClieitInfoArray);
   Inc(Num);
 
   SetLength(PAcceptRec(Param).ClientInfoArr,Num);

   PAcceptRec(Param)^.ClientInfoArr[Num]:=ClientInfo^;
   PAcceptRec(Param).ClientInfoArr[Num].ClientSocket := ClientSock;
   PAcceptRec(Param).ClientInfoArr[Num].ClientAddr   := ClientAddr;
   PAcceptRec(Param).ClientInfoArr[Num].ClientNum    := Num;

   hClientThr := BeginThread(Nil,0,Addr(TCPClientThreadProc),@PAcceptRec(Param).ClientInfoArr[Num ],0, ClientThrId);

   PAcceptRec(Param).ClientInfoArr[Num].hClientThr  := hClientThr;
   PAcceptRec(Param).ClientInfoArr[Num].ClientThrId := ClientThrId;

 end;

end;

end.


 
Rouse_ ©   (2008-08-15 17:53) [1]

Зря ты про троянца упомянул...



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

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.047 c
2-1273081388
SooM
2010-05-05 21:43
2010.08.27
Работа с текстом(перевёртыш)


15-1265790438
12
2010-02-10 11:27
2010.08.27
Переведите пожалуйста на любой диалект VBA ..


15-1265681360
brother
2010-02-09 05:09
2010.08.27
Береги клиента, бабло приносящего


2-1265554936
nordic3
2010-02-07 18:02
2010.08.27
вертикальная синхронизация в OpenGL


2-1268472453
Первокурсница
2010-03-13 12:27
2010.08.27
Программа "Защита от дураков", оператор case