Skocz do zawartości

[Delph]Progblem z soketami numer 2


Astonix

Polecane posty

Sorki że tak syfie wam forum ale jak już nie mam wyjścia , a uważam że świetne te forum to pytam wink.gif. Mam oto kłopot chcę aby najpierw wysłać tekst, który by określał jaką paczke zachwile serwer bedzie wysyłał, a następnie serwer wysyła te paczkę :
[code=Delphi] ss.Socket.Connections[i].SendText('MSGCZAT');
ss.Socket.ConX[WK[Y[K^[[JJN'n'jiŻ^ssj7Ś3&ŚĄh'z(uiyŚIQ4)5M
iPŃĄ4)Ocket.ReceiveBuf(dane,sizeof(dane));^|)zcŚźĄź,śćjuŹ2ąsj:Zs9\"z:Zs9\"<ŁzfĄG#si w)Śź]jkZKŻiŚM
ŃmtMQ5M
iP4)ą6ss.Socket.Connections[i].SendBuf(dane,sizeof(dane)); [/code]
To jest po sprawie , ale no wiesz ,serwer nie bedzie za każdym razem czekać sekunde . Z góry Thx wink.gif

Link do komentarza
Udostępnij na innych stronach

CYTAT(KKKas)Próbuj wysyłać lepiej np:
[quote] RODZAJPACZKI|dane [/quote]
przy odbiorze rozdzielaj odebrane dane i odpowiednio wg typu działaj dalej...

Tak robiłem ciągłem wszcystko na sendtekst(rodzjapaczki|dane) ale taka metoda jest zbyt denerwujaca np wysli tekst o 3000 znakach to przyjdzie najpierw dane (rP|cos cos cos cos); a potem (cos2 cos2 cos2);
Link do komentarza
Udostępnij na innych stronach

CYTAT(Astonix)CYTAT(KKKas)Próbuj wysyłać lepiej np:
[quote] RODZAJPACZKI|dane [/quote]
przy odbiorze rozdzielaj odebrane dane i odpowiednio wg typu działaj dalej...

Tak robiłem ciągłem wszcystko na sendtekst(rodzjapaczki|dane) ale taka metoda jest zbyt denerwujaca np wysli tekst o 3000 znakach to przyjdzie najpierw dane (rP|cos cos cos cos); a potem (cos2 cos2 cos2);To oznaczaj jeszcze koniec kaczki, np. znakiem #!# i jeśli go nie będzie, to czekaj na kolejny pakiet. Dopiero, gdy przyjdzie pakiet z końcem paczki odpowiednio przetwarzaj wszystko.

҉

Link do komentarza
Udostępnij na innych stronach

chodzi o to że wysyłasz swoją wiadomość w takiej postaci 'MSGCZAT#blabla' gdzie blabla to to co chciałeś wysłać przez
ss.Socket.Connections[i].SendBuf(dane,sizeof(dane))
kod do rozdzielania tego sobie napisz zajmie ci to góra 2minuty
potem bierzesz już rozdzielone dane do stringów i po kłopocie robiszwyszystko tak samo

OFF TOP
[quote] koniec kaczki [/quote] jakaś aluzja polityczna czy zwykłe przjęzyczenie? biggrin.gif[/url]

"Może wam pomoge, może nie, może pierdolcie w dupę się"-prof. Jarząbek

Link do komentarza
Udostępnij na innych stronach

Odpowiedzi wszystkie są częściowo poprawne.

Problem kolegi polega na tym, że TCP/IP próbuje przechytrzyć warstwę aplikacji i i tak robi po swojemu - dzieli dane na takie pakiety, jakie jemu pasują. A nie programiście. Specyfikacja TCP/IP gwarantuje ci, że dane dotrą poprawne, w całości i na pewno do ciebie. Nie gwarantuje natomiast ilości danych w konkretnym pakiecie.

Właściwym rozwiązaniem tego problemu jest użycie Socket.SendBuf(buffer,ilość bajtów);
I napisanie protokołu, który bedzie czekał, aż wszystkie dane pojawią się w sockecie, żeby można było je odczytać.

Moim patentem (i nie tylko moim, bo wszędzie tego sie używa) jest wysłanie w 4 pierwszych bajtach (LongInt) wielkości konkretnej paczki danych. Potem czekasz aż w buferze pojawi się odpowiednia ilość danych, odczytujesz je i obrabiasz.

W ten sposób będzie to np. tak:
[LONGINT - Rozmiar: 0040][WORD - TypDanych: 1][Int - Dł Stringu: 34][String - Wiadomość: Cześć, blablabla...]
Pakiet ma długość 40 bajtów.

Przykład:
[delphi][/delphi]

W ten sposób masz pewność, że dane zawsze odczytasz poprawnie. Możesz przesyłać dowolną ilość danych i dowolny format.

Pozdrawiam[/syntax]
Link do komentarza
Udostępnij na innych stronach

Mylisz się. TCP gwarantuje właściwą kolejność docierania pakietów:

Transmission Control Protocol (TCP) provides a reliable byte-stream transfer service between two endpoints on an internet. TCP depends on IP to move packets around the network on its behalf. IP is inherently unreliable, so TCP protects against data loss, data corruption, packet reordering and data duplication by adding checksums and sequence numbers to transmitted data and, on the receiving side, sending back packets that acknowledge the receipt of data.

Źródło: http://www.itprc.com/tcpipfaq/faq-1.htm#what-tcpip
Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...