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 |
---|---|
Konstrukce CSocket objektu. |
Veřejné metody
Název |
Description |
---|---|
Připojí SOKETU popisovač CSocket objektu. |
|
Zruší blokování volání, která právě probíhá. |
|
Vytvoří soket. |
|
Vrací ukazatel na CSocket objekt daný SOKETU zpracování. |
|
Určuje, zda je blokování volání probíhá. |
Chráněné metody
Název |
Description |
---|---|
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
CSocket
Požadavky
Záhlaví: afxsock.h