Конференция "Сети" » Portforwarding посредствам Socket [D7, WinXP]
 
  • Alexsis f (27.11.10 13:15) [0]
    Здравствуйте! Собственно, сабж. Может кто-то подскажет на примере, как это можно сделать и можно ли вообще?
  • Сергей М. © (27.11.10 20:22) [1]

    > как это можно сделать


    За пример реализации можно взять исх.код компонента IdMappedPortTCP
  • Alexsis f (29.11.10 09:37) [2]

    > За пример реализации можно взять исх.код компонента IdMappedPortTCP

    Indy перекапывать, я думаю, себе дороже ). Хотелось бы на чистом socket реализовать
  • Slym © (29.11.10 13:28) [3]
    переделать под чистый сокет:
    1. Сервер на чистом WinAPI
    2. Клиент на чистом WinAPI
    3. Натравить 1 и 2 друг на друга например так:
    procedure TPortMapClientThread.DoTunneling(Peer1,Peer2:TCustomWinSocket);
     function SendBufFully(Peer:TCustomWinSocket;var Buf; Count: Integer):boolean;
     var pBuf:PByte;
       s:integer;
     begin
       result:=false;
       pBuf:=@Buf;
       while count>0 do
       begin
         s:=Peer2.SendBuf(pBuf^,Count);
         if s=0 then exit;
         inc(pBuf,s);
         dec(Count,s);
       end;
       result:=true;
     end;
    var
     FDSet: TFDSet;
     TimeVal: TTimeVal;
     Buf:array[0..4095] of char;
     r:integer;
    begin
     TimeVal.tv_sec := FPortMap.ClientTimeout div 1000;
     TimeVal.tv_usec := (FPortMap.ClientTimeout mod 1000) * 1000;
     while Peer1.Connected and Peer2.Connected do
     begin
       FD_ZERO(FDSet);
       FD_SET(Peer1.SocketHandle, FDSet);
       FD_SET(Peer2.SocketHandle, FDSet);
       if select(0, @FDSet, nil, nil, @TimeVal)>0 then
       begin
         if FD_ISSET(Peer1.SocketHandle, FDSet) then
         begin
           r:=Peer1.ReceiveBuf(Buf,Length(Buf));
           if r=0 then exit;
           if not SendBufFully(Peer2,Buf,r) then exit;
         end;
         if FD_ISSET(Peer2.SocketHandle, FDSet) then
         begin
           r:=Peer2.ReceiveBuf(Buf,Length(Buf));
           if r=0 then exit;
           if not SendBufFully(Peer1,Buf,r) then exit;
         end;
       end else
         exit;
     end;
    end;


    конечно не полный винапи, но допилить 10 мин. делов
  • Сергей М. © (29.11.10 13:50) [4]

    > Alexsis f   (29.11.10 09:37) [2]
    > Indy перекапывать, я думаю, себе дороже


    Но посмотреть-то как там это сделано концептуально, наверно, можно ?)


    > Хотелось бы на чистом socket реализовать


    "Хотелка" должна быть чем-то оправдана.
  • Alexsis f (30.11.10 09:21) [5]

    > Slym,

    благодарю за подсказку. Буду двигаться в этом направлении.
 
Конференция "Сети" » Portforwarding посредствам Socket [D7, WinXP]
Есть новые Нет новых   [134436   +25][b:0][p:0.001]