CSocket-Klasse
Ist von CAsyncSocket, erbt die Kapselung der Windows Sockets APIs und stellt eine höhere Abstraktionsebene als das CAsyncSocket eines - Objekts dar.
class CSocket : public CAsyncSocket
Mitglieder
Öffentliche Konstruktoren
Name |
Description |
---|---|
Erstellt ein CSocket-Objekt. |
Öffentliche Methoden
Name |
Description |
---|---|
Fügt ein SOCKET Handle für ein CSocket-Objekt. |
|
Bricht einen blockierenden Aufruf ab, der gerade ausgeführt wird. |
|
Erstellt einen Socket. |
|
Gibt einen Zeiger auf ein - Objekt zurück, CSocket ein SOCKET Handle angegeben. |
|
Bestimmt, ob ein blockierender Aufruf ausgeführt wird. |
Geschützte Methoden
Name |
Description |
---|---|
Aufgerufen, um während Meldungen beim Warten auf einen blockierenden Aufruf zu verarbeiten, um abzuschließen. |
Hinweise
CSocket funktioniert mit Klassen CSocketFile und CArchive, um das Senden und Empfangen von Daten zu verwalten.
Ein CSocket-Objekt stellt auch die Blockierung, das dem Gleichlaufbetrieb von CArchive erforderlich ist.Sperrfunktionen, wie Receive, Send, ReceiveFrom, SendTo und alle Accept (geerbt von CAsyncSocket), geben WSAEWOULDBLOCK keinen Fehler in CSocket zurück.Stattdessen diese Funktionen warten, bis der Vorgang abgeschlossen ist.Außerdem wird der ursprüngliche Aufruf mit dem Fehler WSAEINTR, wenn CancelBlockingCall aufgerufen wird, während eine dieser Funktionen blockiert wird.
Um ein CSocket-Objekt zu verwenden, rufen Sie den - Konstruktor, dann den Aufruf Create auf um das zugrunde liegende SOCKET Handle (Typ SOCKET) zu erstellen.Die Standardparameter von Create erstellen einen Streamsocket, aber, wenn Sie den Socket mit einem CArchive-Objekt verwenden, können Sie einen Parameter, um einen Datagrammsocket oder Bindung angeben an einen bestimmten Port stattdessen zu erstellen, um einen Serversocket zu erstellen.Stellen Sie eine Verbindung mit einem Clientsocket mithilfe Connect auf Clientseite und Accept auf Serverseite an.Anschließend erstellen Sie ein CSocketFile-Objekt und ordnen Sie sie dem CSocket-Objekt im CSocketFile-Konstruktor auf.Danach erstellen Sie ein CArchive-Objekt zum Senden und einen für das Empfangen von Daten (bei Bedarf), und ordnen Sie sie dem CSocketFile-Objekt im CArchive-Konstruktor auf.Wenn Kommunikation abgeschlossen ist, löschen Sie CArchive, CSocketFile und CSocket-Objekte.Der SOCKET Datentyp wird im Artikel Windows Sockets: Hintergrund beschrieben.
Wenn Sie CArchive mit CSocketFile und CSocket verwenden, treten unter Umständen eine Situation an, in der CSocket::Receive eine Schleife (durch PumpMessages(FD_READ)) auf die angeforderte Menge von Bytes wartenden eingibt.Dies ist, da Windows Sockets nur einen recv Aufruf pro FD_READ-Benachrichtigung gewähren, aber CSocketFile und CSocket können mehrere recv Aufrufe pro FD_READ.Wenn Sie ein FD_READ abrufen, wenn keine zu lesen, gibt Daten, hängt die Anwendung.Wenn Sie nie ein anderes FD_READ abrufen, beendet die Anwendung auf, über dem Socket zu kommunizieren.
Sie können dieses Problem wie folgt auflösen.In der OnReceive-Methode der Socketklasse, Aufruf CAsyncSocket::IOCtl(FIONREAD, ...), bevor Sie die Serialize-Methode der Nachrichtenklasse aufrufen, wenn die erwarteten vom Socket gelesen werden Daten, die Größe eines TCP-Paket überschreiten (maximale Übertragungseinheit des Netzwerkmediums, normalerweise mindestens 1096 Bytes).Wenn die Größe der verfügbaren Daten weniger als benötigt wird, warten Sie auf alle empfangen werden nur Daten, und starten Sie dann den Lesevorgang.
Im folgenden Beispiel ist m_dwExpected die ungefähre Anzahl von Bytes, die der Benutzer erwartet, zu empfangen.Es wird davon ausgegangen, dass Sie es an anderer Stelle im Code deklarieren.
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
}
}
Hinweis |
---|
Wenn Sie MFC-Sockets in den sekundären Threads in einer statisch verknüpften MFC-Anwendung verwenden, müssen Sie AfxSocketInit in jedem Thread aufrufen, der Sockets verwendet, um die Socketbibliotheken zu initialisieren.Standardmäßig wird AfxSocketInit nur im primären Thread aufgerufen. |
Weitere Informationen finden Sie unter Windows Sockets in MFC, Windows Sockets: Verwenden von Sockets mit Archiven, Windows Sockets: Wie Sockets mit Archiven funktionieren, Windows Sockets: Sequenz von Vorgängen, Windows Sockets: Beispiel für Sockets mithilfe der Archive.
Vererbungshierarchie
CSocket
Anforderungen
Header: afxsock.h