Tłok w Socketach...

0

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:)

0

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

0

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.

0

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. :)

0

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...

0

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

0

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.

0

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.

0

Kurcze bedzie trzeba jakis testowy program zrobic!

0

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ć.

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