Autor Wątek: Komunikacja...  (Przeczytany 1083 razy)

Offline TDM

  • Użytkownik

# Luty 23, 2010, 21:09:47
Witam!

Chce się zabrać za napisanie jakieś w miarę miarę komunikacji... Sprawa wygląda tak serwer nie zawsze odpowiada po wysłaniu do niego jakiegoś pakietu czasem sam pierwszy coś wyśle, czyli że może dojść do sytuacji że ja będę wysyłał dane i w tym samym momencie serwer coś będzie do mnie wysyłał, i tu mam pytanie czy będzie jakiś konflikt? Czy podczas wysyłania w buforze recv może być coś do odebrania i bez problemu dane zostaną wysłane ? Nawiązuje połączenie TCP, w tym połączeniu każdy wysłany pakiet ma trafić do celu a warstwa TCP\IP ma się o to zatroszczyć a jak to jest w praktyce? Potrzebna jest funkcja sprawdzająca i w razie potrzeby dosyłająca to co się zostało wysłane ? Kolejna sprawa to bufor recv, z tego co czytałem to on jest mały i jak za dużo wejdzie do niego danych to zaczyna je gubić.. Jest jakieś rozwiązanie ? Następnie, przypuśćmy ze mamy taką sytuacje wysyłam pakiet do serwera, on ma mi na niego odpowiedno odpowiedzieć, i odpowiada, ale w tym samym czasie serwer coś do mnie wysyła, i mam 2 różne pakiety w buforze recv, teraz jak je odróżnić ? Jak je pomyle to wywali mi się program...

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Esidar

  • Użytkownik

# Luty 23, 2010, 22:35:05
TCP nic nie gubi. Protokół zapewnia to że dane są wysyłane w dobrej kolejności i poprawnej wielkości. Wielkość bufora powinieneś sam dobrać tak aby nie był zbyt duży gdyż protokół sam go podzieli na mniejsze części i może się zdarzyć że będzie czekał z wysłaniem ostatniego fragmentu bufora zbyt długo i powstanie lag. Nie mniej, TCP zapewnia że każda z części dojdzie w dobrej kolejności.

To że serwer coś do ciebie wysyła w momencie gdy ty do niego coś wysyłasz, jest zupełnie naturalne. Po prostu musisz cyklicznie sprawdzać czy coś przyszło, nie zależnie od tego że coś wysyłasz.

Pakiety musisz sam sobie oznaczać. TCP zapewnia ich kolejność ale ty musisz wiedzieć do czego służą. Zupełnie normalne jest że wyślesz do serwera 2-3 zapytania dotyczące 2-3 różnych rzeczy a serwer ci odpowie na nie po jakimś bliżej nie określonym czasie (kolejność odpowiedzi będzie taka w jakiej serwer je wyśle).

Offline Kuba®'79™

  • Użytkownik

# Luty 23, 2010, 22:50:55
Chce się zabrać za napisanie jakieś w miarę miarę komunikacji...
IMVHO powinieneś wcześniej nieco poczytać o funkcjonowaniu protokołów z rodziny TCP/IP i programowaniu z ich użyciem... Ja zacząłem od trzytomowych „Sieci komputerowych TCP/IP” D.E. Comera i D.L. Stevensa, ale na pewno są inne co najmniej równie dobre pozycje..

Cytuj
Sprawa wygląda tak serwer nie zawsze odpowiada po wysłaniu do niego jakiegoś pakietu czasem sam pierwszy coś wyśle, czyli że może dojść do sytuacji że ja będę wysyłał dane i w tym samym momencie serwer coś będzie do mnie wysyłał, i tu mam pytanie czy będzie jakiś konflikt? Czy podczas wysyłania w buforze recv może być coś do odebrania i bez problemu dane zostaną wysłane?
Nie będzie konfliktów.

Cytuj
Nawiązuje połączenie TCP, w tym połączeniu każdy wysłany pakiet ma trafić do celu a warstwa TCP\IP ma się o to zatroszczyć a jak to jest w praktyce? Potrzebna jest funkcja sprawdzająca i w razie potrzeby dosyłająca to co się zostało wysłane?
Troszczy się. W TCP dane dojdą do drugiej strony albo dostaniesz błąd (jeżeli będziesz wystarczająco cierpliwy żeby na niego czekać).
Z UDP jest inna historia, ale musisz o tym poczytać.

Cytuj
Kolejna sprawa to bufor recv, z tego co czytałem to on jest mały i jak za dużo wejdzie do niego danych to zaczyna je gubić..
Danych TCP Ci nie zgubi. Po prostu w miarę zapychania bufora odbiorca będzie zmniejszał oferowaną nadawcy ilość bajtów do odebrania, aż do zera i transmisja zatrzyma się do czasu opróżnienia bufora u nadawcy. Poczytaj o tym.

Cytuj
Jest jakieś rozwiązanie?
Może nie doprowadzać do zapchania buforów? ;)

Cytuj
Następnie, przypuśćmy ze mamy taką sytuacje wysyłam pakiet do serwera, on ma mi na niego odpowiedno odpowiedzieć, i odpowiada, ale w tym samym czasie serwer coś do mnie wysyła, i mam 2 różne pakiety w buforze recv, teraz jak je odróżnić ? Jak je pomyle to wywali mi się program...
Nie możesz zależeć w programie od czasu podróży pakietów w sieci (w tym sensie, że jeżeli np. wysyłasz komunikat <zacznij robotę> i spodziewasz się odpowiedzi <zrobiłem>, ale z jakiś względów po pewnym czasie wysyłasz <przerwij robotę> to może być tak, że zanim <przerwij> dotrze do odbiorcy on już dawno skończy (więc Ty w odpowiedzi na <przerwij> powinieneś spodziewać się <przerwałem> ale również i <zrobiłem>, a odbiorca musi umieć obsłużyć pakiet <przerwij> przysłany ni z gruszki ni z pietruszki odnośnie roboty, którą skończył)
TCP  nie pomiesza Ci nigdy kolejności wysłanych danych, UDP może.
Musisz opracować sobie jakąś metodę po której będziesz rozpoznawał pakiety tak, żeby Ci się nie pomieszały.
No i ostatecznie musisz bardzo uważać na wszystkie odebrane dane – ktoś złośliwie lub przez pomyłkę może połączyć się z Twoim serwerem i wysłać mu bzdury, głupio by było, gdyby się wtedy wyłożył....

Offline uzyszkodnik

  • Użytkownik

# Luty 25, 2010, 23:03:23
w ramach luznych skojarzen z  programowaniem sieciowym - send czasem nie posle pelnego bufora, wiec musisz sprawdzac ile wyslales.