Серверное приложение снабжено компонентом TServerSocket, клиентское TClientSocket, используеться порт 1024. При подключении клиента к серверу он (клиент) должен передать серверу строку с именем пользователя (значение поля Edit1), а сервер добавить ее в свою табличку (TMemTableEh). Таким образом получаеться - сервер хранит список активных клиентов
- клиет может запросит этот сисок у сервера
Если оба приложения стартуют на одной и той же машине, то первое не работает, а второе работает. Если на разных, то работает все  В чем может быть дело? Вот код сервера: Код | //---------------------------------------------------------------------------
#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 ); } //---------------------------------------------------------------------------
|
|