Windows Sockets: sekwencja operacji
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 strumienia
Do punktu konstruowania CSocketFile
obiektu następująca sekwencja jest dokładna (z kilkoma różnicami parametrów) dla parametrów i CSocket
CAsyncSocket
. Od tego momentu sekwencja jest ściśle 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 określa również adres. Po stronie klienta użyj parametrów domyślnych, które poproś MFC o użycie 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ą formularza "liczba kropkowana" "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
przyjmujemy nazwę maszyny jednej z pozostałych formularzy.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ływaćCreate
go. 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 wykraczają 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 są bez połączenia, nie wymagają CAsyncSocket::Połączenie, Nasłuchiwanie i akceptowanie wywołań (chociaż opcjonalnie można użyć Connect
polecenia ). Zamiast tego, jeśli używasz klasy CAsyncSocket
, gniazda datagramu używają CAsyncSocket::SendTo
funkcji składowych i ReceiveFrom
. (Jeśli używasz Connect
z gniazdem datagramu, użyj polecenia Send
i Receive
. Ponieważ CArchive
nie działa z datagramami, nie należy używać CSocket
z archiwum, jeśli gniazdo jest datagramem.
Plik CSocketFile nie obsługuje wszystkich CFile
funkcji; CFile
elementy członkowskie, takie jak Seek
, które nie mają sensu dla komunikacji gniazda, są niedostępne. W związku z tym niektóre domyślne funkcje MFC Serialize
nie są zgodne z CSocketFile
programem . Dotyczy to szczególnie CEditView
klasy . Nie należy próbować serializować CEditView
danych za pośrednictwem obiektu dołączonego CArchive
CSocketFile
do obiektu przy użyciu polecenia CEditView::SerializeRaw
; użyj CEditView::Serialize
zamiast tego (nie udokumentowane). 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 też
Gniazda systemu Windows w MFC
Klasa CSocket
CAsyncSocket::Create
CAsyncSocket::Close