Chcialbym sie zapytac czy jesli np. 10 klientow wysle jakis pakiet do serwera ktore dojda dokladnie w tym samym momencie to jak sobie pouklada procedura serversocket.readclient bedze jakas kolejka czy cos? Aha i jeszcze jedno czy wysylanie z clienta np. ClientSocket.Socket.SendBuf(...,SizeOf(...));
ClientSocket.Socket.SendBuf(...,SizeOf(...));
dojdzie jedno i drugie tzn czy druga procedura zostanie wlaczona jesli procedura pierwsza zostanie zakonczona czyli pakier dojdzie do serwera? Czy oba pakiety dojda do serwera? Z gory dzieki troche namieszalem jesli ktos nie kapuje to wytlumacze lepiej:)
Możliwe, że jeśli wyślesz więcej pakietów na raz to dojdą one jako jeden ciąg. U mnie tak się właśnie działo, z tym że ja wysyłałem poprzez Socket.SendText();
Moje propozycje rozwiązania tego problemu:
1) Możesz wstawić na końcu każdego pakietu np. znak #1 (lub inny) i potem podzielić przysłane dane w/g tego znaku używając np. funkcji ExtractStrings().
2) Albo wstawiać na początku pakietu jego długość:
Pakiet := FormatFloat('0000', Length(Pakiet));
A potem rozdzielić pakiet przez:
Pakiet := Copy(Przyslane_dane, 5, StrToInt(Copy(Przyslane_dane,1,4)));
To tak w skrócie... :-P
Jak wyślesz więcej pakietów, to w zależności w jakiej kolejności wysłałeś (nie da sie równocześnie wysłać 10 naraz), w takiej zostaną odebrane. I zmienna Socket bedzie wskazywala na Socket, który odbiera dane.
OK dzieki tak myslalem. Jakby co to nie uzywam juz sendtext bo wlasnie takie wady sa jak laczenie. A pakiet ma juz z gory wyznaczona wielkosc. :)
Jakby co to nie uzywam juz sendtext bo wlasnie takie wady sa jak laczenie. A pakiet ma juz z gory wyznaczona wielkosc. :)
To nie ma znaczenia... Jak robisz SendBuf to też może łączyć
pakiety, specjalnie testowałem...
A co do SendText i SendBuf to nie ma żadnej różnicy [cygaro]
Po prostu SendText jest wygodniejsze...
Nie jestem pewien, ale SendText korzysta chyba z SendBuf, podobnie jak w TIdTCPClient - Write korzysta z WriteBuffer.
Ale głowy za to nie oddam :-P
Aha czyli jesli powiedzmy jest jakis pakiet:
Rekord = packed record
Dane1 = String[255];
Dane2 = String[255];
Dane3 = String[255];
end;
to teraz moze sie zlaczyc ze np Dane1 (powiedzmy 127.0.0.1) i Dane1 (powiedzmy 127.0.0.2) i string wyniesie Dane1[505] to jest chyba bardzo dziwne.
To będzie raczej tak:
pakiet: 127.0.01 pakiet: 127.0.0.2
|rekord: Dane1 Dane2 Dane3| + |rekord: Dane1 Dane2 Dane3|
Do tego pewnie będą jakieś krzaczki między tym wszystkim.
Kurcze bedzie trzeba jakis testowy program zrobic!
Wysyłaj zawsze pakiety w formie:
|DługośćDanych:Integer|Dane|
Wtedy jak się połączą to nie ma problemu, bo znając długość poszczególnych kawałków można je łatwo rozdzielić.