Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > TServerSocket and TClientSocket на одной машине


Автор: rOOxus 5.5.2008, 09:13
Серверное приложение снабжено компонентом TServerSocket, клиентское TClientSocket, используеться порт 1024.
При подключении клиента к серверу он (клиент) должен передать серверу строку с именем пользователя (значение поля Edit1), а сервер добавить ее в свою табличку (TMemTableEh). Таким образом получаеться
  • сервер хранит список активных клиентов
  • клиет может запросит этот сисок у сервера
Если оба приложения стартуют на одной и той же машине, то первое не работает, а второе работает. Если на разных, то работает все  smile
В чем может быть дело?

Вот код сервера:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "main_unt.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "MemTableDataEh"
#pragma link "MemTableEh"
#pragma link "DBGridEh"
#pragma link "GridsEh"
#pragma link "trayicon"
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerSocketClientConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
   TDateTime DateTime;
   AnsiString clString;

   clString = Socket->ReceiveText();

   ClientsMT->Insert();

   if ( clString.IsEmpty() )
   {
      ClientsMT_User->AsString = "???";
   }
   else
   {
      ClientsMT_User->AsString = clString.UpperCase();
   }
   ClientsMT_Id->AsInteger = Socket->SocketHandle;
   ClientsMT_RemoteHost->AsString = Socket->RemoteHost.UpperCase();
   ClientsMT_ConnectTime->AsDateTime = DateTime.CurrentDateTime();

   ClientsMT->Post();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerSocketClientDisconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
   ClientsMT->Locate( "id", Socket->SocketHandle, TLocateOptions() << loCaseInsensitive );
   ClientsMT->Delete();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerSocketClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
   AnsiString  clComm,
               clMsg,
               srvMsg,
               Buffer;
   int         i,
               clCount = 0;


   clMsg = Socket->ReceiveText();

   clComm = strtok ( clMsg.c_str(), "\t" );

   if ( clComm == "List" )
   {
      ClientsMT->First();

      while ( ! ClientsMT->Eof )
      {
         Buffer = Buffer + ClientsMT_Id->AsString + "\t" +
                           ClientsMT_User->AsString + "\t" +
                           ClientsMT_RemoteHost->AsString + "\t" +
                           ClientsMT_ConnectTime->AsString + "\t";

         ClientsMT->Next();
         clCount ++;
      }

      srvMsg = "List\t" + IntToStr( clCount ) + "\t" + Buffer;
   }

   Memo->Lines->Add( srvMsg );
   Socket->SendText( srvMsg );
}
//---------------------------------------------------------------------------



Вот код клиента
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "main_unt.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "DBGridEh"
#pragma link "GridsEh"
#pragma link "MemTableDataEh"
#pragma link "MemTableEh"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
   Caption = ParamStr(1);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ClientSocketError(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
   AnsiString Er;

   if ( ErrorEvent == eeConnect )
   {
      Er = "Сервер сообщений на " + ClientSocket->Host.UpperCase() + " не запущен!"
           "\nНекоторые функции будут недоступны.";
      MessageBox(Handle, Er.c_str(), "Ошибка подключения", MB_ICONWARNING );
   }
   else if ( ErrorEvent == eeReceive )
   {
      Er = "Сервер сообщений на " + ClientSocket->Host.UpperCase() + " не запущен!"
           "\nНевозможно выполнить запрос.";
      MessageBox(Handle, Er.c_str(), "Ошибка запроса", MB_ICONERROR );
   }

   ErrorCode = 0;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ClientSocketRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
   AnsiString  srvMsg,
               srvComm;
   int i;

   srvMsg = Socket->ReceiveText();
   srvComm = strtok ( srvMsg.c_str(), "\t" );

   if ( srvComm == "List" )
   {
      int clCount = StrToInt ( strtok ( NULL, "\t" ) );

      ClientsMT->DestroyTable();
      ClientsMT->CreateDataSet();

      for ( i = 1; i <= clCount; i ++ )
      {
         ClientsMT->Insert();

         ClientsMT_Id->AsString = strtok ( NULL, "\t" );
         ClientsMT_User->AsString = strtok ( NULL, "\t" );
         ClientsMT_RemoteHost->AsString = strtok ( NULL, "\t" );
         ClientsMT_ConnectTime->AsString = strtok ( NULL, "\t" );

         ClientsMT->Post();
      }
   }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ToolButton1Click(TObject *Sender)
{
   ClientSocket->Host = "ASU201-03-XP";
   ClientSocket->Active = true;   
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ToolButton2Click(TObject *Sender)
{
   ClientSocket->Active = false;   
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ToolButton3Click(TObject *Sender)
{
   ClientSocket->Socket->SendText("List\t");   
}
//---------------------------------------------------------------------------


void __fastcall TForm1::ClientSocketConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
   Socket->SendText( Edit1->Text );
}
//---------------------------------------------------------------------------

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)