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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2012, 05:33   #11
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Код:
unit Unit2;

interface

uses
  Classes,ScktComp,WinSock;

type
  TTunnel = class(TThread)
  private
    FClientTimeout:integer;
  protected
    procedure DoTunneling(Peer1,Peer2:TCustomWinSocket);
    procedure Execute; override;
  end;

implementation

{ TTunnel }
procedure TTunnel.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:=Peer.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 := FClientTimeout div 1000;
  TimeVal.tv_usec := (FClientTimeout 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;

procedure TTunnel.Execute;
var
  Sock1,Sock2:TClientWinSocket;
  Host1,Host2:string;
  Port1,Port2:word;
begin
  FClientTimeout:=60000;
  Sock1:=TClientWinSocket.Create(INVALID_SOCKET);
  Sock2:=TClientWinSocket.Create(INVALID_SOCKET);
  try
    Sock1.ClientType:=ctBlocking;
    Sock2.ClientType:=ctBlocking;
    Sock1.Open('',Host1,'',Port1);
    Sock2.Open('',Host2,'',Port2);
    DoTunneling(Sock1,Sock2);
  finally
    Sock1.Free;
    Sock2.Free;
  end;
end;

end.
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 13.03.2012, 06:32   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
а как из этого массива прочитать в переменную некого типа данных
либо CopyMem, либо читать сразу в нее.(зависит все от типа)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.03.2012, 12:39   #13
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

Код:
//44
type mes=record
id:integer;//идентификатор команды
ed:integer;
values:array[0..9] of integer;
end;


//44
type mestext=record
id:integer;//идентификатор команды
ed:integer;
pd:integer;
text:string[16];
text2:string[16];
end;
Надо записать одновременно в две переменных разных типов данных
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Старый 13.03.2012, 14:31   #14
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

сделайте case-тип, будет проще, раз по размеру одно и тоже.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.03.2012, 14:50   #15
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

На вашей схеме сервер может быть любым или он тоже должен быть написан?

Последний раз редактировалось Aliens_wolfs; 13.03.2012 в 16:03.
Aliens_wolfs вне форума Ответить с цитированием
Старый 13.03.2012, 17:54   #16
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
Хорошо

Цитата:
сделайте case-тип, будет проще, раз по размеру одно и тоже.
если я правильно понял вас то как то так?
http://www.delphisources.ru/pages/fa.../Case.php.html

интересная конструкция. даже не знал что так можно. спасибо большое
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Старый 13.03.2012, 19:19   #17
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

кто мешает завести указатель на структуру?

Код:
type
  PMyType=^TMyType;
  TMyType=record
    a,b:integer;
  end;
PMySecondType=^TMySecondType;
  TMySecondType=record
    x,y,z:integer;
  end;
а потом приводить указатель на буфер к типу PMyType


Код:
var
  buf:PChar;
begin

PMyType(buf)^.a:=1;
PMySecondType(buf)^.x:=10;
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 13.03.2012, 19:23   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

зачем применять указатели когда можно отлично обойтись без них?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.03.2012, 19:29   #19
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

ищащий просветления хочет потом строки передавать "разной" так сказать длинны
и тут case recordы уже с натяжкой пойдут, к тому же case на развивающемся протоколе превратятся в монстра
а указатели и сами типы можно легко добавить не ломая прочей логики, и при наличии разных версий клиентов сильно упрощают дальнейшую разработку

доп.
ищащий загнал себя в рамки 44 байт от неумения корректно разрезать входящий трафик. научится и статичных записей станет мало
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 13.03.2012 в 19:31.
Slym вне форума Ответить с цитированием
Старый 13.03.2012, 22:16   #20
Maxxxtri23
Пользователь
 
Регистрация: 04.12.2008
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
Код:
unit Unit2;

interface

uses
  Classes,ScktComp,WinSock;

type
  TTunnel = class(TThread)
  private
    FClientTimeout:integer;
  protected
    procedure DoTunneling(Peer1,Peer2:TCustomWinSocket);
    procedure Execute; override;
  end;

implementation

{ TTunnel }
procedure TTunnel.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:=Peer.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 := FClientTimeout div 1000;
  TimeVal.tv_usec := (FClientTimeout 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;

procedure TTunnel.Execute;
var
  Sock1,Sock2:TClientWinSocket;
  Host1,Host2:string;
  Port1,Port2:word;
begin
  FClientTimeout:=60000;
  Sock1:=TClientWinSocket.Create(INVALID_SOCKET);
  Sock2:=TClientWinSocket.Create(INVALID_SOCKET);
  try
    Sock1.ClientType:=ctBlocking;
    Sock2.ClientType:=ctBlocking;
    Sock1.Open('',Host1,'',Port1);
    Sock2.Open('',Host2,'',Port2);
    DoTunneling(Sock1,Sock2);
  finally
    Sock1.Free;
    Sock2.Free;
  end;
end;

end.
Ошибку кидает =( Может я его не правильно использую?
Вложения
Тип файла: rar tunnel.rar (3.3 Кб, 9 просмотров)
Maxxxtri23 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование сокетов Anubys C/C++ Сетевое программирование 5 26.11.2011 00:33
Динамическое распределение сокетов (С#) Lightsaber Помощь студентам 1 29.09.2011 09:40
Программирование сокетов Win vadakoff C/C++ Сетевое программирование 2 14.10.2010 23:35
правильность закрытия сокетов i-cpp C/C++ Сетевое программирование 3 16.02.2010 19:13
Организация сокетов mar4elo Работа с сетью в Delphi 1 01.01.2009 16:50