Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megjegyzés:
A Microsoft Foundation Classes (MFC) könyvtár továbbra is támogatott. A továbbiakban azonban nem adunk hozzá funkciókat, és nem frissítjük a dokumentációt.
A Windows Sockets API-ból származik CAsyncSocket, örökli annak beágyazását, és magasabb absztrakciós szintet képvisel, mint egy CAsyncSocket objektum.
Szemantika
class CSocket : public CAsyncSocket
Tagok
Nyilvános konstruktorok
| Név | Description |
|---|---|
CSocket::CSocket |
Egy CSocket objektumot hoz létre. |
Nyilvános metódusok
| Név | Description |
|---|---|
CSocket::Attach |
SOCKET Fogópontot csatol egy CSocket objektumhoz. |
CSocket::CancelBlockingCall |
Megszakítja a jelenleg folyamatban lévő blokkoló hívást. |
CSocket::Create |
Létrehoz egy szoftvercsatornát. |
CSocket::FromHandle |
Egy mutatót ad vissza egy CSocket objektumhoz, egy fogópontot SOCKET ad vissza. |
CSocket::IsBlocking |
Meghatározza, hogy egy blokkoló hívás folyamatban van-e. |
Védett metódusok
| Név | Description |
|---|---|
CSocket::OnMessagePending |
A hívás a függőben lévő üzenetek feldolgozására szólított fel, miközben egy blokkoló hívás befejezésére vár. |
Megjegyzések
CSocket az osztályokkal CSocketFileCArchive együttműködve kezeli az adatok küldését és fogadását.
Az CSocket objektumok blokkolást is biztosítanak, ami elengedhetetlen a szinkron művelethez CArchive. A blokkoló függvények, például Receivea , Send, SendToReceiveFrom, és Accept (az összes öröklöttCAsyncSocket) nem ad vissza WSAEWOULDBLOCK hibát a következőbenCSocket: . Ehelyett ezek a függvények megvárják, amíg a művelet befejeződik. Emellett az eredeti hívás WSAEINTR hibával fog leállni, ha CancelBlockingCall a rendszer meghívja őket, miközben az egyik függvény blokkolva van.
Objektum használatához CSocket hívja meg a konstruktort, majd hívja Create meg a mögöttes SOCKET leírót (írja be SOCKET). A streamcsatornák Create létrehozásának alapértelmezett paraméterei, de ha nem objektummal CArchive használja a szoftvercsatornát, megadhat egy paramétert a datagram-szoftvercsatornák létrehozásához, vagy egy adott porthoz kötéssel egy kiszolgálócsatornát hozhat létre. Csatlakozzon egy ügyfélcsatornához Connect az ügyféloldalon és Accept a kiszolgálóoldalon. Ezután hozzon létre egy CSocketFile objektumot, és társítsa az CSocket objektumhoz a CSocketFile konstruktorban. Ezután hozzon létre egy CArchive objektumot a küldéshez, egyet pedig az adatok fogadásához (szükség szerint), majd társítsa őket a CSocketFileCArchive konstruktor objektumához. Ha a kommunikáció befejeződött, pusztítsa el a CArchive, CSocketFileés CSocket objektumokat. Az SOCKET adattípust a Windows Szoftvercsatornák: Háttér című cikkben ismertetjük.
A használat CArchiveCSocketFileCSocketsorán előfordulhat, hogy CSocket::Receive egy ciklust (by PumpMessages(FD_READ)) ad meg, amely a kért bájtmennyiségre vár. Ennek az az oka, hogy a Windows-szoftvercsatornák értesítésenként FD_READ csak egy recv hívást engedélyeznek, de CSocketFileCSocket több recv-hívást is engedélyeznek.FD_READ Ha olyan adatot kap FD_READ , amely nem olvasható, az alkalmazás lefagy. Ha soha nem kap másikat FD_READ, az alkalmazás nem kommunikál a szoftvercsatornán keresztül.
Ezt a problémát az alábbiak szerint oldhatja meg.
OnReceive A szoftvercsatornaosztály metódusában hívja meg CAsyncSocket::IOCtl(FIONREAD, ...) az Serialize üzenetosztály metódusát, ha a szoftvercsatornából beolvasandó várt adatok mérete meghaladja az egy TCP-csomag méretét (a hálózati adathordozó maximális átviteli egysége, általában legalább 1096 bájt). Ha a rendelkezésre álló adatok mérete kisebb a szükségesnél, várja meg az összes adat fogadását, és csak ezután indítsa el az olvasási műveletet.
Az alábbi példában m_dwExpected a felhasználó által várt bájtok hozzávetőleges száma látható. Feltételezzük, hogy a kódot máshol deklarálja.
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
}
}
Megjegyzés:
Ha MFC-szoftvercsatornákat használ másodlagos szálakban egy statikusan csatolt MFC-alkalmazásban, minden olyan szálban meg kell hívnia AfxSocketInit , amely szoftvercsatornákat használ a szoftvercsatorna-kódtárak inicializálásához. Alapértelmezés szerint AfxSocketInit csak az elsődleges szálban van meghívva.
További információ: Windows Sockets in MFC, Windows Sockets: Using Sockets with Archives, Windows Sockets: How Sockets with Archives Work, Windows Sockets: Sequence of Operations, Windows Sockets: Example of Sockets Using Archives.
Öröklési hierarchia
CSocket
Requirements
Fejléc:afxsock.h
CSocket::Attach
A tagfüggvény meghívásával csatolja a hSocket leírót egy CSocket objektumhoz.
BOOL Attach(SOCKET hSocket);
Paraméterek
hSocket
Egy szoftvercsatorna fogópontját tartalmazza.
Visszaadott érték
Nonzero, ha a függvény sikeres.
Megjegyzések
A SOCKET leírót az objektum adattagja m_hSocket tárolja.
További információ : Windows-szoftvercsatornák: Szoftvercsatornák használata archívumokkal.
Example
class CSockThread : public CWinThread
{
public:
SOCKET m_hConnected;
protected:
CChatSocket m_sConnected;
// remainder of class declaration omitted.
BOOL CSockThread::InitInstance()
{
// Attach the socket object to the socket handle
// in the context of this thread.
m_sConnected.Attach(m_hConnected);
m_hConnected = NULL;
return TRUE;
}
// This listening socket has been constructed
// in the primary thread.
void CListeningSocket::OnAccept(int nErrorCode)
{
UNREFERENCED_PARAMETER(nErrorCode);
// This CSocket object is used just temporarily
// to accept the incoming connection.
CSocket sConnected;
Accept(sConnected);
// Start the other thread.
CSockThread *pSockThread = (CSockThread*)AfxBeginThread(
RUNTIME_CLASS(CSockThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
if (NULL != pSockThread)
{
// Detach the newly accepted socket and save
// the SOCKET handle in our new thread object.
// After detaching it, it should no longer be
// used in the context of this thread.
pSockThread->m_hConnected = sConnected.Detach();
pSockThread->ResumeThread();
}
}
CSocket::CancelBlockingCall
Hívja meg ezt a tagfüggvényt a jelenleg folyamatban lévő blokkoló hívás megszakításához.
void CancelBlockingCall();
Megjegyzések
Ez a függvény megszakítja a szoftvercsatornához tartozó összes lezáratlan blokkolási műveletet. Az eredeti blokkoló hívás a lehető leghamarabb leáll a hibával WSAEINTR.
Blokkolási Connect művelet esetén a Windows Sockets implementációja a lehető leghamarabb leállítja a blokkoló hívást, de előfordulhat, hogy a szoftvercsatornák erőforrásai csak a kapcsolat befejezéséig (majd alaphelyzetbe állításáig) vagy időtúllépéséig lesznek felszabadítva. Ez valószínűleg csak akkor lesz észrevehető, ha az alkalmazás azonnal megpróbál megnyitni egy új szoftvercsatornát (ha nincs elérhető szoftvercsatorna), vagy ugyanahhoz a társhoz csatlakozik.
Ha nem törli a műveletet Accept , az meghatározatlan állapotban hagyhatja el a szoftvercsatornát. Ha egy alkalmazás megszakít egy blokkoló műveletet egy szoftvercsatornán, az egyetlen művelet, amelytől az alkalmazás függhet, hogy képes-e végrehajtani a szoftvercsatornát, az a hívás Close, bár más műveletek is működhetnek bizonyos Windows Sockets-implementációkon. Ha maximális hordozhatóságot szeretne az alkalmazás számára, ügyeljen arra, hogy ne függjön a megszakítás utáni műveletek végrehajtásától.
További információ : Windows-szoftvercsatornák: Szoftvercsatornák használata archívumokkal.
CSocket::Create
Hívja meg a Create tagfüggvényt egy szoftvercsatorna-objektum létrehozása után a Windows-szoftvercsatorna létrehozásához és csatolásához.
BOOL Create(
UINT nSocketPort = 0,
int nSocketType = SOCK_STREAM,
LPCTSTR lpszSocketAddress = NULL);
Paraméterek
nSocketPort
Egy adott port, amelyet a szoftvercsatornával kell használni, vagy 0, ha azt szeretné, hogy az MFC válasszon ki egy portot.
nSocketType
SOCK_STREAM vagy SOCK_DGRAM.
lpszSocketAddress
Mutató a csatlakoztatott szoftvercsatorna hálózati címét tartalmazó sztringre, egy pontozott számra, például "128.56.22.8". A paraméter NULL sztringjének átadása azt jelzi, hogy a példánynak figyelnie kell az CSocket ügyféltevékenységet az összes hálózati adapteren.
Visszaadott érték
Nonzero, ha a függvény sikeres; ellenkező esetben 0, és egy adott hibakód lekérhető a hívással GetLastError.
Megjegyzések
Create ezután meghívja Bind a szoftvercsatornát a megadott címhez kötésre. A következő szoftvercsatorna-típusok támogatottak:
SOCK_STREAMSzekvenciált, megbízható, kétirányú, kapcsolatalapú bájtstreameket biztosít. A Transmission Control Protocol (TCP) protokollt használja az internetcímcsaládhoz.SOCK_DGRAMTámogatja a rögzített (általában kis) maximális hosszúságú, kapcsolat nélküli, megbízhatatlan puffereket. A User Datagram Protocol (UDP) protokollt használja az internetcímcsaládhoz. A beállítás használatához nem használhatja a szoftvercsatornát objektummalCArchive.Megjegyzés:
A
Accepttagfüggvény paraméterként egy új, üresCSocketobjektumra mutató hivatkozást vesz fel. Önnek létre kell hoznia ezt az objektumot, mielőtt hívja aAccept-t. Ne feledje, hogy ha ez a szoftvercsatorna-objektum kiesik a hatókörből, a kapcsolat bezárul. Ne hívja megCreateezt az új szoftvercsatorna-objektumot.
A stream- és datagram-szoftvercsatornákról további információt a Windows Sockets: Background, a Windows Sockets: Ports and Socket Addresses, valamint a Windows Sockets: Using Sockets with Archives című cikkben talál.
CSocket::CSocket
Egy CSocket objektumot hoz létre.
CSocket();
Megjegyzések
Az építés után meg kell hívnia a tagfüggvényt Create .
További információ : Windows-szoftvercsatornák: Szoftvercsatornák használata archívumokkal.
CSocket::FromHandle
Egy objektumra mutató mutatót CSocket ad vissza.
static CSocket* PASCAL FromHandle(SOCKET hSocket);
Paraméterek
hSocket
Egy szoftvercsatorna fogópontját tartalmazza.
Visszaadott érték
Egy objektumra mutató CSocket mutató, vagy NULL ha nincs CSocket objektum csatolva.hSocket
Megjegyzések
Ha egy fogópontot SOCKET ad meg, ha egy CSocket objektum nincs csatolva a fogóponthoz, a tagfüggvény visszatér NULL , és nem hoz létre ideiglenes objektumot.
További információ : Windows-szoftvercsatornák: Szoftvercsatornák használata archívumokkal.
CSocket::IsBlocking
Hívja meg ezt a tagfüggvényt annak megállapításához, hogy van-e folyamatban blokkoló hívás.
BOOL IsBlocking();
Visszaadott érték
Nonzero, ha a foglalat blokkolva van; egyéb esetben 0.
Megjegyzések
További információ : Windows-szoftvercsatornák: Szoftvercsatornák használata archívumokkal.
CSocket::OnMessagePending
Bírálja felül ezt a tagfüggvényt, hogy megkeresse a Windows adott üzeneteit, és válaszoljon rájuk a szoftvercsatornában.
virtual BOOL OnMessagePending();
Visszaadott érték
Nemzero, ha az üzenetet kezelték; egyéb esetben 0.
Megjegyzések
Ez egy speciális felülírható.
A keretrendszer meghívja OnMessagePending , miközben a szoftvercsatorna Windows-üzeneteket pumpál, hogy lehetőséget biztosítson az alkalmazás számára érdekes üzenetek kezelésére. A használat OnMessagePendingmódjára példaként tekintse meg a Windows Sockets: Származtatás a szoftvercsatornák osztályaiból című cikket.
További információ : Windows-szoftvercsatornák: Szoftvercsatornák használata archívumokkal.
Lásd még
CAsyncSocket osztály
hierarchiadiagram
CAsyncSocket osztály
CSocketFile osztály