Citat:
krza: Naisao sam na jos jedan problem... Koristim za komunikaciju izmedju servera i client TServerSocket i TClientSocket. E sad u odredjenom trenutku Client posalje Serveru zahtev za ulazak u igru preko SendText npr 'JOIN BLABLa'. Iz nekog razloga skoro svaki drugi put kad server primi taj text preko socket.receivetext on ne izgleda kao 'JOIN BLABLA' nego je prazan string. Zasto se ovo kog djavola dogadja?
SendText() i ReceiveText() nisu bas najsrecnije dizajnirane kao sto nije ni primer za ove metode u Examples folderu Delphija - iako ceo mehanizam TClientSocket/TServerSocket radi odlicno.
Za 100% pouzdano slanje u prijem buffera najcesce se pravi POSEBNA funkcija za slanje i POSEBNA prijem, ali otom potom.
U principu, generalno postoji jedna anomalija kod TClientServer::OnRead(), kada se dogadjaj desi, ali nikakvi podaci nisu preneti. Stoga se pribegava nekom jednostavnom kodu tipa:
Code:
// kod je C++ Builder, ali snaci ces se
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
if ( Socket->ReceiveLength() < 1 ) return;
Memo1->Lines->Add( Socket->ReceiveText() );
}
Dakle, esencija je ovo (da se odmah izadje iz eventa):
Code:
if ( Socket->ReceiveLength() < 1 ) return;
(pretpostavljam da je to ono sto se tebi dogadjalo, ulazio si u obradu eventa, a nista se nije desilo kada je u pitanju prenos)
A sada da razjasnim u cemu je problem kod SendText()-a i primera u Examples.
Naime, kada ti pokusas da preneses neki buffer sa SendText() ti logicno ocekujes da to sto si naveo i bude 100% preneseno. Ipak, mrezna arhitektura i TCP/IP protokol imaju drugaciju logiku. Bice preneseno onoliko bajtiva koliko mreza moze da podnese u tom trenutku, a povratna vrednost ti govori koliko je preneseno da bi ti mogao da nastavis odakle se stalo. Da bi to i realizovao potrebno je serveru proslediti
odmah na pocetku i duzinu bafera za prenos i onda sinhronizovati taj prenos.
Ipak, necu te vise zbunjivati, ovo je cisto da znas na cemu si. Kod za slanje i prijem buffera koji radi 100% imas na netu na vise mesta, a ako se ne snadjes, javi pa da pomognemo.
Poz.