Ir para conteúdo
Fórum Script Brasil
  • 0

Problema com TWinSocketStream


HwTrap

Pergunta

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 para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,8k
×
×
  • Criar Novo...