Brak reakcji ClientConnect lub Read w BCB6

0

Witam .
Oto kod:

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

#include <vcl.h>
#pragma hdrstop

#include "Okno1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
      StatusBar1->Panels->Items[1]->Text = "Brak łącznosci z serwerem...";

}
//---------------------------------------------------------------------------

void __fastcall TForm1::KoniecClick(TObject *Sender)
{
    Application->Terminate();// Zamkni porogram
    ClientSocket->Close(); // zamykanie gnizada
}
//---------------------------------------------------------------------------


void __fastcall TForm1::PolaczClick(TObject *Sender)
{

  if (ClientSocket->Active)
  {
    ClientSocket->Active = false;
  }
  if (InputQuery("Połącz z serwerem", "Address Serwera:", AdresServera))
  {
     if (AdresServera.Length() > 0)
     {
        ClientSocket->Port= 5555;
        ClientSocket->Host = AdresServera;
        ClientSocket->Active = true;
        //ClientSocket->Open();
        

     }
  }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::RozlaczClick(TObject *Sender)
{
  ClientSocket->Close(); // zamykanie gnizada
  StatusBar1->Panels->Items[1]->Text = "Brak łącznosci z serwerem...";
}
//---------------------------------------------------------------------------


void __fastcall TForm1::ClientSocketClientConnect(TObject *Sender, TCustomWinSocket *Socket)
{
   StatusBar1->Panels->Items[1]->Text = "Połączony ...";

}
//---------------------------------------------------------------------------

void __fastcall TForm1::ClientSocketRead(TObject *Sender,
TCustomWinSocket *Socket)
{

ClientSocket->Socket->ReceiveBuf(tablica, sizeof(tablica));
for(int i=0; i<=10; i++){
        TListItem *ElementListy=Lista->Items->Add();
        ElementListy->Caption= tablica[i].klucz;
        ElementListy->SubItems->Add(tablica[i].imie);
        ElementListy->SubItems->Add(tablica[i].nazwisko);
        }
}



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

void __fastcall TForm1::ButtonWysljiClick(TObject *Sender)
{
        ClientSocket->Socket->SendText(EditWyslij->Text);
}
//---------------------------------------------------------------------------

i nagłówki

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

#ifndef Okno1H
#define Okno1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Menus.hpp>
#include <ComCtrls.hpp>
#include <ScktComp.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TGroupBox *GroupBox1;
        TMainMenu *MainMenu1;
        TMenuItem *Files1;
        TMenuItem *Polacz;
        TMenuItem *Rozlacz;
        TMenuItem *Koniec;
        TMenuItem *N1;
        TStatusBar *StatusBar1;
        TLabel *LabelDane;
        TClientSocket *ClientSocket;
        TListView *Lista;
        TEdit *EditWyslij;
        TButton *ButtonWyslji;
        TLabel *LabelPolecenie;
        void __fastcall KoniecClick(TObject *Sender);
        void __fastcall PolaczClick(TObject *Sender);
        void __fastcall RozlaczClick(TObject *Sender);
        void __fastcall ClientSocketClientConnect(TObject *Sender, TCustomWinSocket *Socket);
        void __fastcall ClientSocketRead(TObject *Sender,TCustomWinSocket *Socket);
        void __fastcall ButtonWysljiClick(TObject *Sender);

private:	// User declarations
public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
        AnsiString AdresServera;
        struct
        {
            int klucz; //klucz glowny, moglby byc tez char klucz[11]; by nie robic juz atoi(row[x])
            char imie[64]; //niech to bedzie pole varchar o dlugosci max 64
            char nazwisko[64];
        }tablica[50];

};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Brak jakiejkolwiek reakcji w funkcjach ClientSocketRead i ClientSocketClientConnect a klient łączy się z serwerem Linuxowym na 100%.
I mam taka strukturę
struct
{
int klucz;
char imie[64];
char nazwisko[64];
}tablica[50];
i nie bardzo idzie mi przesłanie jej po sokecie, może ktoś ma doświadczenie z przesyłaniem struktury.
I jeszcze jedno pytanie jak przesyła się zdjęcia np. jpg też w ReceiveBuf i SendBuf?

0
Kilofmar napisał(a)

może ktoś ma doświadczenie z przesyłaniem struktury.

duzo osob, wiele doswiadczenia.. moze wiec zaczniesz od pokazania jak Ty sie do tego zabieralaes, bo w w/w kodzie nie ma na ten temat absolutnie NIC

I jeszcze jedno pytanie jak przesyła się zdjęcia np. jpg

tak jak struktury POD - żywcem, jako tablice bajtow.

0

W linuxie mam tak

struktura wygląda tak

struct
    {
        int klucz; //klucz glowny, moglby byc tez char klucz[11]; by nie robic juz atoi(row[x])
        char imie[64]; //niech to bedzie pole varchar o dlugosci max 64
        char nazwisko[64]; 
    }tablica[50];
    memset(tablica, 0, sizeof(tablica)); 

a proces przesyłania tak

//GLOWNA PETLA		
	while(1) {  
		sin_size = sizeof(struct sockaddr_in);
		if ((gniazdo = accept(server, (struct sockaddr *)&adres_klienta, &sin_size)) == -1 ) {
				//perror("accept");
				continue;
			}
                if (recv(gniazdo, buf, 1, 0) == 0){
			perror("Odbieranie");
			continue;
		}
              		if(buf[0] == 'p'){ //odczyt z bazy danych
			// laczenie z baza danych
			sql.Connect("localhost", "test", "test", "test",3306);
			query = "SELECT * FROM `cpp`";
			res=sql.Query(query); // zapisywanie do bazy danych
							
			if (res) 
			{
				
			for( ii = 0; (row = mysql_fetch_row(res)); ii++) 
				{
					tablica[ii].klucz = atoi((const char*)row[0]);
					strncpy(tablica[ii].imie, (const char*)row[1], 64);
					strncpy(tablica[ii].nazwisko, (const char*)row[2], 64);
				}
					
				if(tablica[0].klucz) send(gniazdo, tablica, sizeof(tablica), 0);
				
				sql.zamkni_mysql();//Zamykamy polaczenie z mysql
			}
						
			
		}
		
	close(gniazdo);
	}

Natomiast w BCB6 tak jak już pisałem jest tak:

Łączenie


void __fastcall TForm1::PolaczClick(TObject *Sender)
{

  if (ClientSocket->Active)
  {
    ClientSocket->Active = false;
  }
  if (InputQuery("Połącz z serwerem", "Address Serwera:", AdresServera))
  {
     if (AdresServera.Length() > 0)
     {
        ClientSocket->Port= 5555;
        ClientSocket->Host = AdresServera;
        ClientSocket->Active = true;
        //ClientSocket->Open();
        StatusBar1->Panels->Items[1]->Text = "Połączony ...";

     }
  }
}

I tu chciałem odebrać ale nie reaguje

void __fastcall TForm1::ClientSocketRead(TObject *Sender,
TCustomWinSocket *Socket)
{

ClientSocket->Socket->ReceiveBuf(tablica, sizeof(tablica));
for(int i=0; i<=10; i++){
        TListItem *ElementListy=Lista->Items->Add();
        ElementListy->Caption= tablica[i].klucz;
        ElementListy->SubItems->Add(tablica[i].imie);
        ElementListy->SubItems->Add(tablica[i].nazwisko);
        }
}
0

po pierwsze:

if(tablica[0].klucz) send(gniazdo, tablica, sizeof(tablica), 0);

"tablica" ma rozmiar co najmniej 6600 bajtow, send moze tego nie wyslac w jednym kawalku, zwlaszcza przy wiekszej ilosci wierszy. spodziewaj sie, ze send za ktoryms razem wysle tylko kawalek z tego SIZE ktore mu zadajesz.

po drugie: co znaczy 'nie reaguje' ?

0

Nie reaguje np. ja rozumiem że w momencie połączenia powinno zadziałać funkcja

void __fastcall TForm1::ClientSocketClientConnect(TObject *Sender, TCustomWinSocket *Socket)

a w momencie odbierania danych

void __fastcall TForm1::ClientSocketRead(TObject *Sender,TCustomWinSocket *Socket)

ale nie wykonuje sie to co jest w tych funkcjach, próbowałem już nawet ze zwykłym komunikatem tak:

void __fastcall TForm1::ClientSocketClientConnect(TObject *Sender, TCustomWinSocket *Socket)
{
   ShowMessage( "Połączony ...");

}

Dopiero zaczynam zabawę w BCB6 i może o czym zapomniałem albo nie włączyłem czegoś.

//q: oj,. to po tej stronie (BCB) to ja juz Ci nie podpowiem.. poczekaj na jakiegos borlandowca..

1 użytkowników online, w tym zalogowanych: 0, gości: 1