Jump to content
Fórum Script Brasil
  • 0

Problema com TWinSocketStream


HwTrap

Question

Pessoal, eu envio um texto para o servidor via ClientSocket... E o servidor me responde. Eu quero pegar essa resposta, mas não consigo ter sucesso... O código tá assim:

procedure MyThread.SendText(Command: string; MySocket: TClientSocket);
var
  ReceivedString: string;
  SockStream: TWinSocketStream;
  Buffer: array[0..1023] of Char;
begin
  FillChar(Buffer, SizeOf(Buffer), #0);
  SockStream := TWinSocketStream.Create(MySocket.Socket, 2000);

  if Command='Username' then
    begin
      MySocket.Socket.SendText('USER test'+#13+#10); //quando eu envio isso, recebo uma resposta tipo: '+OK Password required'
      while SockStream.Read(Buffer, SizeOf(Buffer)) <> 0 do ​//isso devia ler a resposta e por dentro da ReceivedString... Mas não acontece nada.
        ReceivedString:= ReceivedString + Buffer;

Alguém sabe me dizer o porque? Eu tenho certeza que o timeout de 2s dá e sobra tempo pra receber a resposta... E tenho ctz que o socket está me enviando essa resposta... o que fazer??

Link to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 0

Hey, I'm tryin to receive a socket response but no success... And don't know why. Look my code:

procedure MyThread.SendText(Command: string; MySocket: TClientSocket);
var
  ReceivedString: string;
  SockStream: TWinSocketStream;
  Buffer: array[0..1023] of Char;
begin
  FillChar(Buffer, SizeOf(Buffer), #0);
  SockStream := TWinSocketStream.Create(MySocket.Socket, 2000);

  if Command='Username' then
    begin
      MySocket.Socket.SendText('USER test'+#13+#10); //when I send this, I receive a response like '+OK Password required'
      while SockStream.Read(Buffer, SizeOf(Buffer)) <> 0 do //this should read the response and put in ReceivedString, but nothing happens...
        ReceivedString:= ReceivedString + Buffer;

I'm sending the 'USER test' with success, and the server is answering with the message... But I can't receive this message... Why??

http://www.opensc.ws/delphi-help/17771-how...html#post161269

OBS: Esse post tambem é seu ???

Link to comment
Share on other sites

  • 0

Infelizmente não ajudaram... O primeiro link nem usa o método .Read do SocketStream... Dificil isso cara, não faz sentido, porque eu tenho 100% de certeza que recebo a resposta do socket, mas por algum motivo não consigo ler... Deixa eu te explicar uma coisa... O primeiro texto que recebo logo quando conecto, é uma mensagem de boas vindas. Então assim que conecto eu faço o seguinte, jogo na minha procedure ReceiveText... Como segue abaixo o code:

MySocket.Active:= true;    
  if (MySocket.Socket.Connected = true) then
   ReceiveText(MySocket)
Aí logo no inicio dessa procedure ReceiveText tem:
procedure MyThread.ReceiveText(MySocket: TClientSocket);
var
  ReceivedString: string;
  SockStream: TWinSocketStream;
  Buffer: array[0..1023] of Char;
begin
 FillChar(Buffer, SizeOf(Buffer), #0);
 SockStream := TWinSocketStream.Create(MySocket.Socket, 2000);
  while (SockStream.Read(Buffer, SizeOf(Buffer)) <> 0) do
    ReceivedString:= ReceivedString + Buffer;

  if (BannerCtrl = 0) and (AnsiStartsStr('+', ReceivedString)) then
      begin
        inc(BannerCtrl);
        Form1.Memo1.Lines.Add(ReceivedString);
      end;

 if (BannerCtrl > 0) and (UserAuthCtrl = 0) then
    begin
      SockStream.Free;
      SendText('UserAuth',MySocket);
    end;
Eu recebo a mensagem de boas vindas com sucesso, adiciono ela num MEMO e logo depois de adicionar chamo a procedure SendText que tá assim:
procedure MyThread.SendText(Command: string; MySocket: TClientSocket);
begin
  if Command='UserAuth' then
    begin
      MySocket.Socket.SendText('USER test'+#13+#10);
      inc(UserAuthCtrl);
      ReceiveText(MySocket);
    end;
end;

Bom, ou seja, eu envio o USER test, incremento uma var pra controle apenas e chamo novamente a ReceiveText, o MySocket ali é o ClientSocket que to passando como parametro pra elas funcionarem corretamente... Aí lá na ReceiveText, o inicio é justamente aquela parte pra ler algum texto do socket... Eu já li a mensagem de boas vindas com sucesso, já add no memo, já sai da procedure, enviei o 'USER test', recebi a resposta tipo: OK password please... Era pra eu conseguir pegar essa resposta agora concorda? OK password please... Mas não pega, já tentei mudar isso aqui de todos os jeitos possíveis! Não vai. Eu to pensando se é prq na verdade, eu não chego a sair da procedure ReceiveText e já chamo a procedure SendText... Depois chamo novamente a ReceiveText... Será que é isso que tá causando o problema?

Link to comment
Share on other sites

  • 0
Eu to pensando se é prq na verdade, eu não chego a sair da procedure ReceiveText e já chamo a procedure SendText... Depois chamo novamente a ReceiveText... Será que é isso que tá causando o problema?

Pode ser sim, porque você não está dando ao seu código de um ( tempo ) de obter as mensagens de sockets da fila

veja se consegue entender esse exemplo:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, scktcomp;

type
  TService1 = class(TService)
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceContinue(Sender: TService; var Continued: Boolean);
    procedure ServicePause(Sender: TService; var Paused: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

  TSparkyThread = class(TThread)
    ClientSocket1: TClientSocket;
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
  public
    procedure Execute; override;
  end;


var
  Service1: TService1;

implementation

var
  SparkyThread: TSparkyThread;


{$R *.DFM}


procedure TSparkyThread.Execute;

procedure GetMessages;
  var
    Msg : TMsg;
  begin
    while not Terminated and PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
  end;

begin
  ClientSocket1 := TClientSocket.Create(application);
  ClientSocket1.Port := 80;
  ClientSocket1.Host := '192.168.1.100';
  ClientSocket1.OnConnect := ClientSocket1Connect;

  while not Terminated do
  begin
    Beep;
    Sleep(5000);
    ClientSocket1.Active:=True;
    GetMessages;

  end;

end;


procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
  SparkyThread:=TSparkyThread.Create(False);
  Started:=True;
end;

procedure TSparkyThread.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  ClientSocket1.Socket.SendText('some text');
  ClientSocket1.Active:=False;
end;

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Service1.Controller(CtrlCode);
end;

function TService1.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TService1.ServiceContinue(Sender: TService;
  var Continued: Boolean);
begin
  SparkyThread.Resume;
  Continued:=True;
end;

procedure TService1.ServicePause(Sender: TService; var Paused: Boolean);
begin
  SparkyThread.Suspend;
  Paused:=True;
end;

procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  SparkyThread.Terminate;
  Stopped:=True;
end;

end.

abraço

Link to comment
Share on other sites

  • 0

Jhonas, o que você falou estava certo, eu não estava dando o tempo necessário para o socket receber o texto. Então no meio do código puis o método Waitfordata do TWinSocketStream. E aí funcionou... Mas, estranho porque eu na verdade, estava listening numa porta local, e redirecionando pra uma conexão remota, então eu via os pacotes, e as respostas do socket chegavam bem antes e o programa não conseguia pegar. Se não for pedir demais, tem como você me explicar o por que disso? A resposta já tinha aparecido no meu redirecionador de conexão mas o socket não conseguia puxá-la?

Link to comment
Share on other sites

  • 0

Se não for pedir demais, tem como você me explicar o por que disso?

SOCKETS! Observando o protocolo de comunicação das ferramentas de Instant Messaging, um servidor executa uma thread que "escuta" uma porta TCP qualquer. Esta thread será a responsável por estabelecer os canais de comunicação entre o servidor e seu(s) cliente(s).

Um cliente abre um canal (socket) de comunicação com o servidor, avisando que está ativo e que enviará uma requisição. O servidor então se prepara para receber esta requisição, enviada como texto puro pelo cliente. Enviada a solicitação, o cliente espera pela resposta do servidor de que recebeu a solicitação. Resposta recebida, o cliente fica a espera do processamento da solicitação.

Enquanto o cliente aguarda, o servidor processa a solicitação. Como já sabe quem é o cliente e onde ele está, retorna o resultado de seu processamento pelo mesmo canal de comunicação com o cliente, que também tem uma thread responsável por ouvir uma porta TCP, respondendo à solicitação. Esta resposta também vem em texto puro ( mas não ideal ), o que torna sua transmissão mais leve que a transmissão de pacotes binários. O cliente então processa o retorno da solicitação, exibindo as informações necessárias ao usuário e fechando o canal de comunicação.

Basicamente, o tempo de resposta está diretamente ligado a maneira como os dados são transportados na rede e ao tipo de servidor utilizado.

abraço

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...