Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Opmerking
De Microsoft Foundation Classes-bibliotheek (MFC) wordt nog steeds ondersteund. We voegen echter geen functies meer toe of werken de documentatie bij.
Afgeleid van CAsyncSocket, neemt de inkapseling van de Windows Sockets-API over en vertegenwoordigt een hoger abstractieniveau dan dat van een CAsyncSocket object.
Syntaxis
class CSocket : public CAsyncSocket
Leden
Openbare constructors
| Naam | Description |
|---|---|
CSocket::CSocket |
Maakt een CSocket object. |
Openbare methoden
| Naam | Description |
|---|---|
CSocket::Attach |
Hiermee wordt een SOCKET ingang aan een CSocket object gekoppeld. |
CSocket::CancelBlockingCall |
Hiermee wordt een blokkeringsoproep geannuleerd die momenteel wordt uitgevoerd. |
CSocket::Create |
Hiermee maakt u een socket. |
CSocket::FromHandle |
Retourneert een aanwijzer naar een CSocket object, op basis van een SOCKET ingang. |
CSocket::IsBlocking |
Bepaalt of een blokkeringsoproep wordt uitgevoerd. |
Beveiligde methoden
| Naam | Description |
|---|---|
CSocket::OnMessagePending |
Aangeroepen om berichten in behandeling te verwerken terwijl wordt gewacht tot een blokkeringsoproep is voltooid. |
Opmerkingen
CSocket werkt met klassen CSocketFile en CArchive om het verzenden en ontvangen van gegevens te beheren.
Een CSocket object biedt ook blokkeren, wat essentieel is voor de synchrone werking van CArchive. Blokkerende functies, zoals Receive, Send, ReceiveFrom, , SendToen Accept (alle overgenomen van CAsyncSocket), retourneren WSAEWOULDBLOCK geen fout in CSocket. In plaats daarvan wachten deze functies totdat de bewerking is voltooid. Bovendien wordt de oorspronkelijke aanroep beëindigd met de fout WSAEINTR als deze wordt aangeroepen terwijl CancelBlockingCall een van deze functies wordt geblokkeerd.
Als u een CSocket object wilt gebruiken, roept u de constructor aan en roept Create u vervolgens aan om de onderliggende SOCKET ingang (type SOCKET) te maken. De standaardparameters voor het maken van Create een stroomsocket, maar als u de socket niet met een CArchive object gebruikt, kunt u in plaats daarvan een parameter opgeven om een datagramsocket te maken of een specifieke poort verbinden om een serversocket te maken. Maak verbinding met een clientsocket aan Connect de clientzijde en Accept aan de serverzijde. Maak vervolgens een CSocketFile object en koppel het aan het CSocket object in de CSocketFile constructor. Maak vervolgens een CArchive object voor verzenden en één voor het ontvangen van gegevens (indien nodig) en koppel deze vervolgens aan het CSocketFile object in de CArchive constructor. Wanneer de communicatie is voltooid, vernietigt u de CArchive, CSocketFileen CSocket objecten. Het SOCKET gegevenstype wordt beschreven in het artikel Windows Sockets: Background.
Wanneer u CArchive met CSocketFile en CSocket, kunt u een situatie tegenkomen waarbij CSocket::Receive een lus (per PumpMessages(FD_READ)) wordt ingevoerd die wacht op de aangevraagde hoeveelheid bytes. Dit komt doordat Windows-sockets slechts één recv-aanroep per FD_READ melding toestaan, maar CSocketFile meerdere CSocket recv-aanroepen per FD_READtoestaan. Als er geen FD_READ gegevens worden gelezen, loopt de toepassing vast. Als u nooit een andere FD_READkrijgt, stopt de toepassing met communiceren via de socket.
U kunt dit probleem als volgt oplossen. Roep in de OnReceive methode van uw socketklasse CAsyncSocket::IOCtl(FIONREAD, ...) aan voordat u de Serialize methode van uw berichtklasse aanroept wanneer de verwachte gegevens uit de socket de grootte van één TCP-pakket overschrijden (maximale transmissie-eenheid van het netwerkmedium, meestal ten minste 1096 bytes). Als de grootte van de beschikbare gegevens kleiner is dan nodig is, wacht u tot alle gegevens zijn ontvangen en start u de leesbewerking alleen.
In het volgende voorbeeld m_dwExpected is het geschatte aantal bytes dat de gebruiker verwacht te ontvangen. Er wordt van uitgegaan dat u deze ergens anders in uw code declareert.
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
}
}
Opmerking
Wanneer u MFC-sockets gebruikt in secundaire threads in een statisch gekoppelde MFC-toepassing, moet u elke thread aanroepen AfxSocketInit die sockets gebruikt om de socketbibliotheken te initialiseren.
AfxSocketInit Standaard wordt alleen aangeroepen in de primaire thread.
Zie 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.
Overnamehiërarchie
CSocket
Requirements
Rubriek:afxsock.h
CSocket::Attach
Roep deze lidfunctie aan om de hSocket ingang aan een CSocket object te koppelen.
BOOL Attach(SOCKET hSocket);
Parameterwaarden
hSocket
Bevat een greep naar een socket.
Retourwaarde
Niet-nul als de functie is geslaagd.
Opmerkingen
De SOCKET ingang wordt opgeslagen in het gegevenslid van m_hSocket het object.
Zie Windows Sockets: Sockets gebruiken met archieven voor meer informatie.
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
Roep deze lidfunctie aan om een blokkerende aanroep te annuleren die momenteel wordt uitgevoerd.
void CancelBlockingCall();
Opmerkingen
Deze functie annuleert eventuele openstaande blokkeringsbewerkingen voor deze socket. De oorspronkelijke blokkeringsoproep wordt zo snel mogelijk beëindigd met de fout WSAEINTR.
In het geval van een blokkeringsbewerking Connect beëindigt de Implementatie van Windows Sockets de blokkeringsaanroep zo snel mogelijk, maar het is mogelijk niet mogelijk dat de socketresources worden vrijgegeven totdat de verbinding is voltooid (en vervolgens opnieuw is ingesteld) of een time-out optreedt. Dit is waarschijnlijk alleen merkbaar als de toepassing onmiddellijk probeert een nieuwe socket te openen (als er geen sockets beschikbaar zijn) of om verbinding te maken met dezelfde peer.
Annuleren van een andere bewerking dan Accept kan de socket een onbepaalde status hebben. Als een toepassing een blokkeringsbewerking op een socket annuleert, is de enige bewerking die de toepassing kan uitvoeren afhankelijk van het feit dat de socket kan worden uitgevoerd, een aanroep naar Close, hoewel andere bewerkingen kunnen werken voor sommige Implementaties van Windows Sockets. Als u maximale draagbaarheid voor uw toepassing wenst, moet u er voorzichtig mee zijn dat u niet afhankelijk bent van het uitvoeren van bewerkingen na een annulering.
Zie Windows Sockets: Sockets gebruiken met archieven voor meer informatie.
CSocket::Create
Roep de Create lidfunctie aan nadat u een socketobject hebt gemaakt om de Windows-socket te maken en deze te koppelen.
BOOL Create(
UINT nSocketPort = 0,
int nSocketType = SOCK_STREAM,
LPCTSTR lpszSocketAddress = NULL);
Parameterwaarden
nSocketPort
Een bepaalde poort die moet worden gebruikt met de socket of 0 als u wilt dat MFC een poort selecteert.
nSocketType
SOCK_STREAM of SOCK_DGRAM.
lpszSocketAddress
Een aanwijzer naar een tekenreeks met het netwerkadres van de verbonden socket, een gestippeld getal, zoals '128.56.22.8'. Het doorgeven van de NULL-tekenreeks voor deze parameter geeft aan dat het CSocket exemplaar moet luisteren naar clientactiviteit op alle netwerkinterfaces.
Retourwaarde
Niet-nul als de functie is geslaagd; anders 0 en een specifieke foutcode kan worden opgehaald door aan te roepen GetLastError.
Opmerkingen
Create
Bind roept vervolgens aan om de socket te binden aan het opgegeven adres. De volgende sockettypen worden ondersteund:
SOCK_STREAMBiedt gesequentieerde, betrouwbare, tweerichtings-bytestreams op basis van verbindingen. Maakt gebruik van Transmission Control Protocol (TCP) voor de internetadresfamilie.SOCK_DGRAMOndersteunt datagrammen, die verbindingsloze, onbetrouwbare buffers van een vaste (meestal kleine) maximale lengte zijn. Gebruikt UDP (User Datagram Protocol) voor de internetadresfamilie. Als u deze optie wilt gebruiken, moet u de socket niet gebruiken met eenCArchiveobject.Opmerking
De
Acceptlidfunctie verwijst naar een nieuw, leegCSocketobject als parameter. U moet dit object maken voordat u aanroeptAccept. Houd er rekening mee dat als dit socketobject buiten het bereik valt, de verbinding wordt gesloten. Roep dit nieuwe socketobject niet aanCreate.
Zie de artikelen Windows Sockets: Background, Windows Sockets: Ports and Sockets, and Windows Sockets, and Windows Sockets: Using Sockets with Archives voor meer informatie over stromen en datagram sockets.
CSocket::CSocket
Maakt een CSocket object.
CSocket();
Opmerkingen
Na de constructie moet u de Create lidfunctie aanroepen.
Zie Windows Sockets: Sockets gebruiken met archieven voor meer informatie.
CSocket::FromHandle
Retourneert een aanwijzer naar een CSocket object.
static CSocket* PASCAL FromHandle(SOCKET hSocket);
Parameterwaarden
hSocket
Bevat een greep naar een socket.
Retourwaarde
Een aanwijzer naar een CSocket object of NULL als er geen CSocket object aan is gekoppeld hSocket.
Opmerkingen
Wanneer een SOCKET ingang wordt gegeven en een CSocket object niet aan de ingang is gekoppeld, retourneert NULL de lidfunctie en wordt er geen tijdelijk object gemaakt.
Zie Windows Sockets: Sockets gebruiken met archieven voor meer informatie.
CSocket::IsBlocking
Roep deze lidfunctie aan om te bepalen of er een blokkerende aanroep wordt uitgevoerd.
BOOL IsBlocking();
Retourwaarde
Niet-nul als de socket wordt geblokkeerd; anders 0.
Opmerkingen
Zie Windows Sockets: Sockets gebruiken met archieven voor meer informatie.
CSocket::OnMessagePending
Overschrijf deze lidfunctie om te zoeken naar bepaalde berichten van Windows en erop te reageren in uw socket.
virtual BOOL OnMessagePending();
Retourwaarde
Niet-nul als het bericht is verwerkt; anders 0.
Opmerkingen
Dit is een geavanceerd overschrijfbaar.
Het framework roept aan OnMessagePending terwijl de socket Windows-berichten pompt, zodat u kunt omgaan met berichten die van belang zijn voor uw toepassing. Zie het artikel Windows Sockets: Afgeleid van Socket-klassen voor voorbeelden van hoe u deze kunt gebruikenOnMessagePending.
Zie Windows Sockets: Sockets gebruiken met archieven voor meer informatie.
Zie ook
CAsyncSocket klasse
Hiërarchiegrafiek
CAsyncSocket klasse
CSocketFile klasse