Sdílet prostřednictvím


Třída CSocket

Je odvozen z CAsyncSocket, dědí jeho zapouzdření rozhraní Windows Sockets API a představuje vyšší úroveň abstrakce, než CAsyncSocket objektu.

class CSocket : public CAsyncSocket

Členy

Veřejné konstruktory

Název

Description

CSocket::CSocket

Konstrukce CSocket objektu.

Veřejné metody

Název

Description

CSocket::Attach

Připojí SOKETU popisovač CSocket objektu.

CSocket::CancelBlockingCall

Zruší blokování volání, která právě probíhá.

CSocket::Create

Vytvoří soket.

CSocket::FromHandle

Vrací ukazatel na CSocket objekt daný SOKETU zpracování.

CSocket::IsBlocking

Určuje, zda je blokování volání probíhá.

Chráněné metody

Název

Description

CSocket::OnMessagePending

Při čekání na dokončení blokování volání se nazývá proces čekající zprávy.

Poznámky

CSocketPráce s třídami CSocketFile a CArchive Správa odesílání a příjem data.

A CSocket objekt také poskytuje blokování, které je nezbytné pro provoz synchronní CArchive.Blocking functions, such as Receive, Send, ReceiveFrom, SendTo, and Accept (all inherited from CAsyncSocket), do not return a WSAEWOULDBLOCK error in CSocket.Místo toho tyto funkce vyčkejte dokončení operace.Navíc původní volání bude ukončena s chybou WSAEINTR li CancelBlockingCall je volána při jedné z těchto funkcí je blokování.

Použití CSocket objekt, volání konstruktoru, volejte Create vytvořit základní SOCKET zpracování (typ SOCKET).Výchozí parametry Create vytvořit soket proudu, ale pokud nepoužíváte soketu s CArchive objekt, můžete zadat parametr místo vytvoření soketu datagram nebo vázat na určitý port vytvořit soket serveru.Připojení k soketu klienta pomocí Connect na straně klienta a Accept na straně serveru.Vytvořte CSocketFile objektu a přidružit jej k CSocket v objektu CSocketFile konstruktor.Dále vytvořit CArchive objektu pro odesílání a jeden pro příjem dat (podle potřeby), potom spojit je s CSocketFile v objektu CArchive konstruktor.Po dokončení komunikace zničit CArchive, CSocketFile, a CSocket objekty.SOCKET Typ dat je popsána v článku Windows Sockets: pozadí.

Při použití CArchive s CSocketFile a CSocket, může nastat situace, kdy CSocket::Receive ve smyčce (podle PumpMessages(FD_READ)) čeká na požadované množství bajtů.Totiž Windows sockets umožňuje pouze jedno volání recv za FD_READ oznámení, ale CSocketFile a CSocket povolit více recv volání za FD_READ.Pokud FD_READ při nejsou žádná data ke čtení, aplikace přestane reagovat.Pokud nikdy získat jiný FD_READ, přestane aplikace komunikaci přes soketu.

Tento problém lze vyřešit následujícím způsobem.V OnReceive metoda třídy socket, volání CAsyncSocket::IOCtl(FIONREAD, ...) před voláním Serialize metoda třídy zpráv při čtení ze soketu očekávaná data přesahuje jeden paket TCP (maximum transmission unit síťové médium, zpravidla nejméně 1096 bajtů).Pokud je velikost dat k dispozici méně než potřebné, počkejte všechna data příjmu a pouze spusťte operaci čtení.

V následujícím příkladu m_dwExpected je přibližný počet bajtů, které očekává uživatel.Předpokládá se, deklarovat je jinde v kódu.

void CChatSocket::OnReceive(int nErrorCode)
{
   CSocket::OnReceive(nErrorCode);

   DWORD dwReceived;

   if (IOCtl(FIONREAD, &dwReceived))
   {
      if (dwReceived >= m_dwExpected)   // Process only if you have enough data
         m_pDoc->ProcessPendingRead();
   }
   else
   {
      // Error handling here
   }
}

[!POZNÁMKA]

Při použití MFC sokety v sekundární podprocesů aplikace staticky propojené knihovny MFC, musíte zavolat AfxSocketInit v každém vlákně, používající sokety pro inicializaci knihovny soketů.Ve výchozím AfxSocketInit je volána pouze v primárním vlákně.

Další informace naleznete v Windows Sockets v MFC, Windows Sockets: pomocí soketů s archivy, Windows Sockets: jak Sockets archivy práce, Windows Sockets: sekvence operací, Windows Sockets: příklad z Sockets pomocí archivy.

Hierarchii dědičnosti

Třídy CObject

CAsyncSocket

CSocket

Požadavky

Záhlaví: afxsock.h

Viz také

Referenční dokumentace

Třída CAsyncSocket

Graf hierarchie

Třída CAsyncSocket

Třída CSocketFile