Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule pokazano obok siebie sekwencję operacji dla gniazda serwera i gniazda klienta. Ponieważ gniazda używają CArchive
obiektów, muszą być gniazdami strumieniowymi.
Sekwencja operacji dla komunikacji gniazda strumieniowego
Aż do momentu konstrukcji obiektu CSocketFile
, następująca sekwencja jest odpowiednia (z kilkoma różnicami parametrów) dla CAsyncSocket
i CSocket
. Od tego momentu sekwencja jest przeznaczona wyłącznie dla elementu CSocket
. W poniższej tabeli przedstawiono sekwencję operacji konfigurowania komunikacji między klientem a serwerem.
Konfigurowanie komunikacji między serwerem a klientem
Serwer | Klient |
---|---|
// construct a socket CSocket sockSrvr; |
// construct a socket CSocket sockClient; |
// create the SOCKET sockSrvr.Create(nPort); 1,2 |
// create the SOCKET sockClient.Create( ); 2 |
// start listening sockSrvr.Listen( ); |
|
// seek a connection sockClient.Connect(strAddr, nPort); 3,4 |
|
// construct a new, empty socket CSocket sockRecv; // accept connection sockSrvr.Accept( sockRecv ); 5 |
|
// construct file object CSocketFile file(&sockRecv); |
// construct file object CSocketFile file(&sockClient); |
// construct an archive CArchive arIn(&file, CArchive::load); — lub — CArchive arOut(&file, CArchive::store); - lub oba - |
// construct an archive CArchive arIn(&file, CArchive::load); — lub — CArchive arOut(&file, CArchive::store); - lub oba - |
// use the archive to pass data: arIn >> dwValue; — lub — arOut << dwValue; 6 |
// use the archive to pass data: arIn >> dwValue; — lub — arOut << dwValue; 6 |
Gdzie nPort jest numerem portu. Aby uzyskać szczegółowe informacje na temat portów , zobacz Windows Sockets: Ports and Socket Addresses (Gniazda systemu Windows: porty i adresy gniazd ).
Serwer musi zawsze określać port, aby klienci mogli się łączyć. Wywołanie
Create
czasami może określać także adres. Po stronie klienta użyj parametrów domyślnych, które instruują MFC do wykorzystania dowolnego dostępnego portu.Gdzie nPort jest numerem portu i strAddr jest adresem maszyny lub adresem PROTOKOŁU internetowego (IP).
Adresy maszyn mogą mieć kilka form: "ftp.microsoft.com", "microsoft.com". Adresy IP używają formatu kropkowanego "127.54.67.32". Funkcja
Connect
sprawdza, czy adres jest liczbą kropkowaną (chociaż nie sprawdza, czy liczba jest prawidłową maszyną w sieci). Jeśli nie,Connect
przyjmuje nazwę hosta jednego z pozostałych formatów.Podczas wywoływania
Accept
po stronie serwera należy przekazać odwołanie do nowego obiektu gniazda. Należy najpierw skonstruować ten obiekt, ale nie wywołuj go przy użyciuCreate
. Należy pamiętać, że jeśli ten obiekt gniazda wykracza poza zakres, połączenie zostanie zamknięte. MFC łączy nowy obiekt z uchwytem SOCKET . Gniazdo można skonstruować na stosie, jak pokazano, lub na stercie.Archiwum i plik gniazda są zamykane, gdy wychodzą poza zakres. Destruktor obiektu gniazda wywołuje również funkcję elementu członkowskiego Close dla obiektu gniazda, gdy obiekt wykracza poza zakres lub jest usuwany.
Dodatkowe uwagi dotyczące sekwencji
Sekwencja wywołań pokazanych w poprzedniej tabeli dotyczy gniazda strumienia. Gniazda datagramu, które nie wymagają ustanowienia połączenia, nie wymagają wywołań CAsyncSocket::Connect, Listen i Accept (chociaż można ich opcjonalnie używać Connect
). Zamiast tego, jeśli używasz klasy CAsyncSocket
, użyj funkcji składowych CAsyncSocket::SendTo
i ReceiveFrom
dla gniazd datagramu. (Jeśli używasz Connect
z zestawem danych gniazda, używasz Send
i Receive
.) Ponieważ CArchive
nie działa z zestawami danych, nie należy używać CSocket
w przypadku archiwum, jeśli gniazdo jest zestawem danych.
Plik CSocketFile nie obsługuje wszystkich CFile
funkcji; CFile
elementy, takie jak Seek
, które nie mają sensu w kontekście komunikacji przez gniazda, są niedostępne. W związku z tym niektóre domyślne funkcje MFC Serialize
nie są zgodne z CSocketFile
. Dotyczy to szczególnie CEditView
klasy . Nie należy próbować serializować danych CEditView
poprzez obiekt CArchive
dołączony do obiektu CSocketFile
przy użyciu CEditView::SerializeRaw
; zamiast tego użyj CEditView::Serialize
(nieudokumentowane). Funkcja SerializeRaw oczekuje, że obiekt pliku będzie miał funkcje, takie jak Seek
, które CSocketFile
nie obsługują.
Aby uzyskać więcej informacji, zobacz:
Zobacz także
Windows Sockets w MFC
Klasa CSocket
CAsyncSocket::Create
CAsyncSocket::Close