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 strumienia

Do punktu konstruowania CSocketFile obiektu następująca sekwencja jest dokładna (z kilkoma różnicami parametrów) dla parametrów i CSocketCAsyncSocket . 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
  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 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.

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

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

  6. 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ć Connectpolecenia ). 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 CFilefunkcji; 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 CSocketFileprogramem . 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