Udostępnij za pośrednictwem


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 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
  1. 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 ).

  2. 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.

  3. Gdzie nPort jest numerem portu i strAddr jest adresem maszyny lub adresem PROTOKOŁU internetowego (IP).

  4. 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.

  5. 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życiu Create. 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.

  6. 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