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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2011, 21:14   #1
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
Восклицание socket и потоки ТРАБЛА не знаю какая !

[CODE]
Код:
unit Client;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Winsock, StdCtrls,NB30, ExtCtrls;
type
  TDynStringArray = array of string;
type
  TMainForm = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Edit1: TEdit;
    Panel1: TPanel;
    Panel2: TPanel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Panel1Click(Sender: TObject);
  Private
  Public
    //procedure Connect;
	function GetIPFromHost(const HostName: string): string;
    procedure SendData(Data: String);
    procedure ReceiveData(Socket: TSocket; Buffer: PByte);
    function Explode(const Separator, S :String; Limit :Integer = 0): TDynStringArray;
  end;
var
  MainForm: TMainForm;
  Close1:    Boolean;
  hPort: Integer;
  hHost: String;
  trid,trid2 : thandle;
   hSocket:  TSocket;
   Addr:     TSockAddrIn;
   wsaData:  TWSAData;
implementation
{$R *.dfm}

procedure TMainForm.ReceiveData(Socket: TSocket; Buffer: PByte);
var
  Data,decodeData: String;
  strArr: TDynStringArray;
begin
  Data := String(Buffer);
  Data := Trim(Data);
  decodeData:=decode(Data);
  if Length(decodeData) > 0 then
  begin
    StrArr := Explode('|', decodeData);
    if StrArr[0] = 'MSGBOX' then
      begin
        MessageBox(0,pchar(StrArr[1]),'System Message',MB_OK + MB_ICONINFORMATION)
      end
    else
    if StrArr[0] = 'show' then
      begin
           panel1.visible:=false;
           panel2.visible:=true;
      end
    else
   if StrArr[0] = 'off' then
      begin
        Exitprocess(0);
      end;
  end
  else
    showmessage('Length(Data) = 0');
end;

procedure Connect;
var
  Buffer: Array[0..8192] Of Char;
  iRecv: Integer;
Begin
  if (WSAStartup($0202, wsaData) <> 0) then
  begin
    Exit;
  end;
  Close1 := False;
  repeat
    hSocket := Socket(AF_INET, SOCK_STREAM, 0);
    Addr.sin_family   := AF_INET;
    Addr.sin_port     := htons(hPort);
    Addr.sin_addr.S_addr := INET_ADDR(PChar(MainForm.GetIPFromHost(hHost)));
    if (Winsock.Connect(hSocket, Addr, SizeOf(Addr)) = 0) then
    begin
      MainForm.SendData('ADDNEW|');
      ZeroMemory(@Buffer, SizeOf(Buffer));
      iRecv := Recv(hSocket, Buffer, SizeOf(Buffer), 0);
      while ((iRecv > 0) and (iRecv <> INVALID_SOCKET)) do
      begin
        MainForm.ReceiveData(hSocket, @Buffer);
        ZeroMemory(@Buffer, SizeOf(Buffer));
        iRecv := Recv(hSocket, Buffer, SizeOf(Buffer), 0);
      end;
      CloseSocket(hSocket);
    end;
    Sleep(3000);
   until (Close1);
  WSACleanup();
end;

procedure TMainForm.Button2Click(Sender: TObject);
begin
SendData('MESSAGE|' +edit1.Text);
end;

function TMainForm.GetIPFromHost(const HostName: string): string;
type
  TaPInAddr = array[0..10] of PInAddr;
  PaPInAddr = ^TaPInAddr;
var
  phe: PHostEnt;
  pptr: PaPInAddr;
  i: Integer;
begin
  Result := '';
  phe := GetHostByName(PChar(HostName));
  if phe = nil then Exit;
  pPtr := PaPInAddr(phe^.h_addr_list);
  i := 0;
  while pPtr^[i] <> nil do
  begin
    Result := inet_ntoa(pptr^[i]^);
    Inc(i);
  end;
end;

function TMainForm.Explode(const Separator, S :String; Limit :Integer = 0): TDynStringArray;
  var
    SepLen: Integer;
    F, P: PChar;
begin
  SetLength(Result, 0);
  if (S = '') or (Limit < 0) then
    Exit;
  if Separator = '' then
    begin
      SetLength(Result, 1);
      Result[0] := S;
      Exit;
    end;
  SepLen := Length(Separator);
  P := PChar(S);
  while P^ <> #0 do
    begin
      F := P;
      P := AnsiStrPos(P, PChar(Separator));
      if (P = nil) or ((Limit > 0) and (Length(Result) = Limit - 1)) then
        P := StrEnd(F);
      SetLength(Result, Length(Result) + 1);
      SetString(Result[High(Result)], F, P - F);
      F := P;
      if P = Separator then
        SetLength(Result, Length(Result) + 1);
      while (P^ <> #0) and (P - F < SepLen) do
        Inc(P);
    end;
end;

procedure TMainForm.SendData(Data: String);
var
  Len: LongInt;
begin
  Len := Length(Data);
  Send(hSocket, Data[1], Len, 0);
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
  hHost :='127.0.0.1';
  hPort := 123;
  createthread(nil,0,@Connect,0,0,trid);
end;
end.
//проблема в том что после обработки этого кода все виснет а точнее форма
можно обрабатывать только переменные и меседжи а если какой то объект вот как на примере панель то виснет в чем трабла ?

if StrArr[0] = 'show' then
begin
panel1.visible:=false;
panel2.visible:=true;
end

Последний раз редактировалось fucil; 21.09.2011 в 21:16.
fucil вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как скопировать дизайн сайта?знаю на каком движке стоит и какая версия MiSTiK31 PHP 3 28.11.2010 20:29
трабла с idsmtp b2soft Работа с сетью в Delphi 1 20.03.2010 00:35
трабла с прогой kafatron Помощь студентам 2 04.09.2009 23:05
Трабла с RaveReport5 heavy Общие вопросы Delphi 0 23.02.2007 15:14