Qt C++ QTcpSocket & QTcpServer

0

Jak w tytule.

Chciałbym zapytać czy ktoś wyjaśniłby mi do czego są te dwie klasy ? Wiem co to jest protokół TCP (jest to protokół który steruje transmisją sieciową i w odróżnieniu od UDP jest pewnym protokołem który otrzymuje potwierdzenie dotarcia pakietu do celu - transmisja dwukierunkowa)

Do czego tych klas można użyć ? Czy ktoś z was podałby przykład ? (Nie koniecznie to musi być kod, chociaż byłoby ciekawie)

1

Do komunikacji sieciowej za pomocą TCP. Właściwie każde połączenie, które wykonujesz (http(s), irc, smtp, ftp, ssh, gg) pod spodem korzysta z TCP.

0

może tak z grubej rury aby uprzedzić kiepskie rady

serwer - w dużym skrócie, maszyna która udostępnia jakieś usługi np www, poczty etc...
klient - łączy się z serwerem aby skorzystać z usług np www, poczty etc...
gniazdo - przez to wychodzą pakiety (już nie wnikam jak lecą ramki) - w sumie obie maszyny mają gniazda, jest jeszcze coś takiego jak port aby ramka wiedziałą do jakiego programu ma dotrzeć np do przeglądarki port 80...

a teraz jeżeli wiem czym jest powyższe, to czy już umiem programować komunikację sieciową ?

0

Czyli nie wiesz. Nie chodzi tu o maszynę jeśli chodzi o serwer, tylko o fakt prowadzenia nasłuchu na nowe połączenia. Przeczytaj pdfa, którego podlinkowałem.

1

Serwer w rozumieniu TCP, jest to program, który nasłuchuje na połączenia (listen(2)), w przeciwieństwie do klienta, który się z serwerem łączy (connect(2)).
Generalnie, wszystkie inne aspekty są w tej definicji zbędne. W szczególności, nie musi obsługiwać wielu połączeń, może mieć więcej niż jeden adres. Nie należy sobie zbyt wiele wyobrażać. I owszem, uczy się tego na studiach.

0

No wiec jak ja to rozumiem w ujęciu programistycznym w odniesieniu do Qt

QTcpSocket - w sumie jest to gniazdo które wysyła pakiety. Np wciskam w programie przycisk "wyślij" i dane wysyłają się przez sieć (piszę bardzo ogólnikowo, nie wnikam w to, że zestawiana jest transmisja TCP, że uzgadniane są komunikaty, kontrola błędów, potwierdzenie, kolejność ramek, porty itp...) - bardziej mi chodzi o krótki zrozumiały opis czym ta klasa jest

QTcpServer - ten mechanizm odbierze to co wysłałem z komputera klienckiego przez QTcpSocket. Np program mi coś wysłał, a serwer to odbierze i coś z tym zrobi np w dalszym programowym przetwarzaniu wyświetli na ekranie...

ogólnie chodzi mi o to, że przez Socket dane wychodzą, a przez Server dane wchodzą - coś w rodzaju we/wy ale w kontekście do sieci

wiem, że moje rozumowanie jest zbyt prostackie, no ale chciałbym to zrozumieć jak to się odbywa w ujęciu typowo programistycznym. Pytanie czy dobrze rozumiem to co napisałem ?

1

Rozumowanie jest nie tyle prostackie, co błędne. Połączenie między serwerem a klientem w TCP jest full-duplex, a więc zarówno serwer jak i klient mają możliwość i wysyłania i odbierania danych. Różnica polega na tym kto inicjuje połączenie (klient), a kto pasywnie na nie oczekuje (serwer).

3

Może taka analogia pomoże. Serwer to centralka telefoniczna w call center. Gdy do niej dzwonisz, może odrzucić połączenie, ale może też je zaakceptować. Jeśli je zaakceptuje, przekaże je do jednej z osób odpowiedzialnych za obsługę klienta. Podczas połączenia telefonicznego obie osoby mogą do siebie mówić i nawzajem się słyszą.

W tej analogii nowe połączenie jest np. reprezentowane przez QTcpSocket), a centralka to QTcpServer. Podczas nawiązywania połączenia po stronie serwera tworzony jest socket po stronie aplikacji serwerowej (więc dwa sockety ze sobą gadają, a serwer osobno czeka (lub nie) na nowe).

0

@kq nawiązując do tego co napisałeś

QTcpSocket mają oboje klient i QTcpServer, z tym, że QTcpServer ma już w sobie QTcpSocket i jest bardziej rozbudowanym narzędziem które służy do obsługi połączeń przychodzących, jest w ciągłej gotowości (nasłuch) by odbierać połączenia przychodzące.

QTcpSocket, powstaje wtedy gdy klient chce wysłać dane przez sieć. Czyli służy tylko i wyłącznie do wysyłania.

W skrócie.
QTcpSocket używamy do wysyłania strumienia danych na wyraźne żądanie
QTcpServer używamy do odbierania strumienia danych i jest w ciągłym nasłuchu połączeń przychodzących (działa w pętli zdarzeń)

przynajmniej takie wnioski płyną z dokumentacji

QTcpSocket (...) that allows you to establish a TCP connection and transfer streams of data

QTcpServer (...) This class makes it possible to accept incoming TCP connections.

Czy dobrze rozumiem ?

0

Źle. QTcpSocket to klasa do obsługi pojedynczego połączenia. QTcpServer to klasa do obsługi nasłuchu. Jeśli do serwera podłącza się nowy klient, dla tego połączenia tworzony jest nowy QTcpSocket który obsługuje to konkretne połączenie.

W bardziej Berkeleyowskim rozumieniu, serwer to specjalny socket nasłuchujący, który może akceptować połączenia, dla każdego połączenia tworzony jest po stronie serwera socket za nie odpowiedzialny.

Sockety mogą zarówno wysyłać i odbierać dane.

0

no to z dokumentacji nie wywnioskowałem tego, że
QTcpServer odbiera wiele połączeń i jest w stanie obsłużyć to konkretne na konkretny port do konkretnego programu

QTcpSocket jedno połączenie na wyraźne żądanie

przynajmniej pajace tego nie napisali...

no ale skąd miałem to wiedzieć ? Ale dzięki za wyjaśnienie, przynajmniej teraz wiem gdzie to mogę zastosować

0

Dokumentacja to nie tutorial, zakłada pewne podstawy wiedzy. Ta z Qt i tak jest kapitalna.

0

@zkubinski: Przeczytaj BJ's guide to network programming. Przerób dokładnie przykłady. Wszystko się wyjaśni.

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