[prev in list] [next in list] [prev in thread] [next in thread] 

List:       twsocket
Subject:    [twsocket] SocketSpy
From:       richard () quicksilvercollectibles ! com
Date:       2011-01-15 23:46:22
Message-ID: E1PeFqF-0000v9-5o () quicksilvermail ! net
[Download RAW message or body]

Hi All,

I have done a cbuilder translation of Mr. Mestdagh's SpocketSpy 
program. But, I have a problem. When I run the program and try to 
connect with a server, I get this immediate error:

"An unknown response was received in response to a request for 
information from the news server 'SocketSpyC++ Local TCP Proxy'"

Under the details button of the error dialog, I get:

SocketSpyC++ Local TCP Proxy

Configuration:
   Account: SocketSpyC++ Local TCP Proxy
   Server: 127.0.0.1
   Protocol: NNTP
   Port: 119
   Secure(SSL): 0
   Code: 800ccca0

I don't have any idea what the problem is. First, while trying to 
debug, I put a popup messagebox at the end of the 
WSocketServerClientConnect procedure to take a look at a variable. 
What I discovered was that messagebox being open allowed the program 
to actually connect and go further before error. After that, I 
replaced the messagebox with an Application->ProcessMessages() loop 
as a test. I was amazed that after that, the program ran completely 
and reliably--everytime. It works just great, but I haven't tried 
more than 1 connection because of the ProcessMessages loop. Though 
the loop has been helpful, I doubt it is the appropriate fix for this.

I'm wondering if this problem is somehow related to changes made to 
cbuilder in the 2007 edition I'm using. I have already discovered and 
fixed 2 other problems related to the 2007 upgrade.

I'm using Vista64. My source code is included below. I hope you'll 
forgive me if I have included too much code. My program is 257 lines. 
Please have a look.

Regards,

Richard Christman
https://www.quicksilvermail.net

socketwins.h:
//--------------------------------------------------------------------
-------
#ifndef socketwinsH
#define socketwinsH
//--------------------------------------------------------------------
-------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "OverbyteIcsWndControl.hpp"
#include "OverbyteIcsWSocket.hpp"
#include "OverbyteIcsWSocketS.hpp"
#include <ComCtrls.hpp>
//--------------------------------------------------------------------
-------

class TSocketWin : public TForm
{
__published:	// IDE-managed Components
	TRichEdit *TCPLog;
	TStatusBar *StatusBar;
	TEdit *RemoteAddr;
	TLabel *Label3;
	TEdit *RemotePort;
	TLabel *Label2;
	TEdit *LocalPort;
	TLabel *Label1;
	TButton *ListenBtn;
	TWSocketServer *WSocketServer;
	void __fastcall WSocketServerClientConnect(TObject *Sender,
		  TWSocketClient *Client, WORD Error);
	void __fastcall WSocketServerClientDisconnect(TObject *Sender,
		  TWSocketClient *Client, WORD Error);
	void __fastcall WSocketServerSessionClosed(TObject *Sender, WORD 
Error);
	void __fastcall ListenBtnClick(TObject *Sender);
private:	// User declarations
	void __fastcall BgException(TObject *Sender, Exception *E, bool 
&CanClose);
	void __fastcall ClientDataAvailable(TObject *Sender, WORD Error);
	void __fastcall RemoteSessionConnected(TObject *Sender, WORD Error);
	void __fastcall RemoteDataAvailable(TObject *Sender, WORD Error);
	void __fastcall RemoteSessionClosed(TObject *Sender, WORD Error);
	void __fastcall RemoteDnsLookupDone(TObject *Sender, WORD Error);
public:		// User declarations
	bool cancel;
	TStrings *log;
	__fastcall TSocketWin(TComponent* Owner);
	__fastcall virtual ~TSocketWin();
	void __fastcall Log(AnsiString Msg);
};

class TClient : public TWSocketClient
{
public:
	AnsiString rcvd;
	TWSocket *remote;
	__fastcall TClient(TComponent *Owner);
	__fastcall virtual ~TClient();
};

//--------------------------------------------------------------------
-------
extern PACKAGE TSocketWin *SocketWin;
//--------------------------------------------------------------------
-------
#endif

socketwins.cpp:
//--------------------------------------------------------------------
-------
#include <vcl.h>
#pragma hdrstop

#include "socketwins.h"
//--------------------------------------------------------------------
-------
#pragma package(smart_init)
#pragma link "OverbyteIcsWndControl"
#pragma link "OverbyteIcsWSocket"
#pragma link "OverbyteIcsWSocketS"
#pragma resource "*.dfm"
TSocketWin *SocketWin;
const AnsiString lineend = "\r\n";
const bool linemode = true;
//--------------------------------------------------------------------
-------

__fastcall TSocketWin::TSocketWin(TComponent* Owner)
	: TForm(Owner)
{
   log = TCPLog->Lines;
}
//--------------------------------------------------------------------
-------

__fastcall TSocketWin::~TSocketWin()
{
}
//--------------------------------------------------------------------
-------

void __fastcall TSocketWin::ListenBtnClick(TObject *Sender)
{
   if (ListenBtn->Tag == 0)
   {
	  NNTPLog->Clear();
	  WSocketServer->Banner = "Welcome to OverByte ICS TcpSrv";
	  WSocketServer->BannerTooBusy = "Sorry, too many connections!";
	  WSocketServer->ClientClass = __classid(TClient);
	  WSocketServer->Port = LocalPort->Text;
	  WSocketServer->Addr = "127.0.0.1";
	  WSocketServer->Listen();

	  LocalPort->Enabled  = false;
	  RemotePort->Enabled = false;
	  RemoteAddr->Enabled = false;
	  ListenBtn->Caption  = "Cancel";
	  ListenBtn->Tag = 1;
	  cancel = false;
   }
   else
   {
	  cancel = true;
	  for (int i = 0; i < WSocketServer->ClientCount; i++)
		 WSocketServer->Client[i]->Close();
	  WSocketServer->Close();
   }
}
//--------------------------------------------------------------------
-------

void __fastcall TSocketWin::WSocketServerClientConnect(TObject 
*Sender,
	  TWSocketClient *Client, WORD Error)
{
   if (Error)
   {
	  Log("Error at WSocketServerClientConnect: " + IntToStr(Error));
	  return;
   }

   Log("Remote connection opened");
   TClient *client = dynamic_cast<TClient*>(Client);
   assert(client != NULL);

   client->rcvd = "";
   client->OnBgException = BgException;
   client->OnDataAvailable = ClientDataAvailable;
   client->LineMode = linemode;
   client->LineEnd = lineend;
   client->remote = new TWSocket(client);
   client->remote->Port = RemotePort->Text;
   client->remote->LineMode = linemode;
   client->remote->LineEnd = lineend;
   client->remote->OnBgException = BgException;
   client->remote->OnSessionConnected = RemoteSessionConnected;
   client->remote->OnDataAvailable = RemoteDataAvailable;
   client->remote->OnSessionClosed = RemoteSessionClosed;
   client->remote->OnDnsLookupDone = RemoteDnsLookupDone;
   client->remote->DnsLookup(RemoteAddr->Text);

   StatusBar->Panels->Items[1]->Text = WSocketServer->ClientCount;
   StatusBar->Panels->Items[3]->Text = client->GetPeerAddr();

   while (!cancel && !Application->Terminated)
	  Application->ProcessMessages();
}
//--------------------------------------------------------------------
-------

void __fastcall TSocketWin::WSocketServerClientDisconnect(TObject 
*Sender,
	  TWSocketClient *Client, WORD Error)
{
   if (Error)
   {
	  Log("Error at WSocketServerClientDisconnect: " + IntToStr(Error));
	  return;
   }

   int clientcount = WSocketServer->ClientCount;
   StatusBar->Panels->Items[1]->Text = IntToStr(clientcount - 1);
   if (clientcount > 1)
	  StatusBar->Panels->Items[3]->Text =
		 WSocketServer->Client[clientcount - 2]->GetPeerAddr();
   else
	  StatusBar->Panels->Items[3]->Text = "";
}
//--------------------------------------------------------------------
-------

void __fastcall TSocketWin::WSocketServerSessionClosed(TObject 
*Sender,
	  WORD Error)
{
   LocalPort->Enabled = true;
   RemotePort->Enabled = true;
   RemoteAddr->Enabled = true;
   ListenBtn->Caption = "Listen";
   ListenBtn->Tag = 0;
   cancel = true;
}
//--------------------------------------------------------------------
----------

void __fastcall TSocketWin::BgException(TObject *Sender, Exception 
*e, bool &CanClose)
{
   Log("Exception occured: the error reported was: " + e->Message);
   CanClose = true;
}
//--------------------------------------------------------------------
-------

void __fastcall TSocketWin::ClientDataAvailable(TObject *Sender, WORD 
Error)
{
   if (Error)
   {
	  Log("Error at ClientDataAvailable: " + IntToStr(Error));
	  return;
   }

   TClient *client = dynamic_cast<TClient*>(Sender);
   assert(client != NULL);

   client->rcvd += client->ReceiveStr();
   if (client->remote->State == wsConnected && client->rcvd != "")
   {
	  client->remote->SendStr(client->rcvd);
	  Log("> " + client->rcvd);
	  client->rcvd = "";
   }
}
//--------------------------------------------------------------------
-------

void __fastcall TSocketWin::RemoteDataAvailable(TObject *Sender, WORD 
Error)
{
   if (Error)
   {
	  Log("Error at RemoteDataAvailable: " + IntToStr(Error));
	  return;
   }

   TWSocket *remote = dynamic_cast<TWSocket*>(Sender);
   TClient *client = dynamic_cast<TClient*>(remote->Owner);
   assert(client != NULL);

   AnsiString rcvd = remote->ReceiveStr();
   if (rcvd != "")
   {
	  if (client->State == wsConnected)
	  {
		 client->SendStr(rcvd);
		 Log("< " + rcvd);
	  }
	  else
	  {
		 Log("Error: Local has closed");
		 remote->CloseDelayed();
	  }
   }
}
//--------------------------------------------------------------------
-------

void __fastcall TSocketWin::RemoteSessionConnected(TObject *Sender, 
WORD Error)
{
   if (Error)
   {
	  Log("Error at RemoteSessionConnected: " + IntToStr(Error));
	  return;
   }

   Log("Remote connection opened");
   TWSocket *remote = dynamic_cast<TWSocket*>(Sender);
   TClient *client = dynamic_cast<TClient*>(remote->Owner);
   assert(client != NULL);

   if (client->rcvd != "")
   {
	  remote->SendStr(client->rcvd);
	  client->rcvd = "";
   }
}
//--------------------------------------------------------------------
-------

void __fastcall TSocketWin::RemoteSessionClosed(TObject *Sender, WORD 
Error)
{
   if (Error)
   {
	  Log("Error at RemoteSessionClosed: " + IntToStr(Error));
	  return;
   }

   TClient *client = dynamic_cast<TClient*>(((TWSocket*)Sender)-
>Owner);
   assert(client != NULL);

   client->Shutdown(1);
}
//--------------------------------------------------------------------
-------

void __fastcall TSocketWin::RemoteDnsLookupDone(TObject *Sender, WORD 
Error)
{
   if (Error)
   {
	  Log("Error at RemoteDnsLookupDone: " + IntToStr(Error));
	  return;
   }

   TWSocket *remote = dynamic_cast<TWSocket*>(Sender);
   assert(remote != NULL);

   remote->Addr = remote->DnsResult;
   remote->Connect();
}
//--------------------------------------------------------------------
-------

void __fastcall TSocketWin::Log(AnsiString Msg)
{
   while (Msg.Length() && Msg[Msg.Length()] == '\n' || 
Msg[Msg.Length()] == '\r')
	  Msg.Delete(Msg.Length(), 1);
   log->Add(Msg);
}

//--------------------------------------------------------------------
-------
// TClient
//--------------------------------------------------------------------
-------

__fastcall TClient::TClient(TComponent *Owner)
   : TWSocketClient(Owner)
{
}
//--------------------------------------------------------------------
-------

__fastcall TClient::~TClient()
{
   remote->CloseDelayed();
   delete remote;
}
//--------------------------------------------------------------------
-------
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic