Klasa CSocket
Wynika z CAsyncSocket, dziedziczy jej hermetyzację interfejsu API Windows Sockets i reprezentuje wyższy poziom abstrakcji, niż w przypadku CAsyncSocket obiektu.
class CSocket : public CAsyncSocket
Członkowie
Publiczne konstruktory
Nazwa |
Opis |
---|---|
Konstrukcje CSocket obiektu. |
Metody publiczne
Nazwa |
Opis |
---|---|
Dołącza GNIAZDO uchwyt, aby CSocket obiektu. |
|
Anuluje wywołanie blokowania, który jest obecnie w toku. |
|
Tworzy gniazda. |
|
Zwraca wskaźnik do CSocket obiektu, biorąc pod uwagę GNIAZDO obsługi. |
|
Określa, czy blokowanie połączeń jest w toku. |
Metody chronione
Nazwa |
Opis |
---|---|
O nazwie proces oczekujące wiadomości podczas oczekiwania na wywołanie blokowania zakończyć. |
Uwagi
CSocketwspółpracuje z klasy CSocketFile i CArchive do zarządzania wysyłania i odbierania danych.
A CSocket obiektu również umożliwia blokowanie, co jest niezbędne do pracy synchronicznej z CArchive.Blocking functions, such as Receive, Send, ReceiveFrom, SendTo, and Accept (all inherited from CAsyncSocket), do not return a WSAEWOULDBLOCK error in CSocket.Zamiast tego te funkcje czekać, aż do zakończenia operacji.Dodatkowo, oryginalny rozmowa zostanie zakończona z powodu błędu WSAEINTR Jeśli CancelBlockingCall nazywa się podczas jednej z tych funkcji jest blokowanie.
Aby użyć CSocket obiektu, wywołanie konstruktora, następnie wywołać Create do tworzenia podstawowych SOCKET obsługi (typ SOCKET).Parametry domyślne Create utworzyć gniazda strumienia, ale jeśli nie używasz gniazda z CArchive obiektu, można określić parametr zamiast tego utworzyć gniazdo datagramu lub bind do określonego portu utworzyć gniazda serwera.Podłączyć do gniazda klienta za pomocą Connect po stronie klienta i Accept po stronie serwera.Następnie utwórz CSocketFile obiektu i skojarzyć go do CSocket obiekt w CSocketFile Konstruktor.Następnie należy utworzyć CArchive obiekt do wysyłania i jeden do odbierania danych (w razie potrzeby), a następnie skojarzyć je z CSocketFile obiekt w CArchive Konstruktor.Po zakończeniu łączności, zniszczyć CArchive, CSocketFile, i CSocket obiektów.SOCKET Typ danych jest opisany w artykule Windows Sockets: tło.
Podczas korzystania z CArchive z CSocketFile i CSocket, może wystąpić sytuacja, gdy CSocket::Receive wchodzi w pętlę (przez PumpMessages(FD_READ)) czeka na żądana ilość bajtów.To jest, ponieważ Windows sockets zezwala na tylko jedno wywołanie recv za powiadomienie FD_READ, ale CSocketFile i CSocket Zezwalaj na wiele wywołań recv na FD_READ.Jeśli masz FD_READ, gdy nie ma żadnych danych do odczytu, aplikacja zawiesza się.Jeśli nie masz w innym FD_READ, aplikacja przestanie działać, komunikować się za pośrednictwem gniazda.
Ten problem można rozwiązać następująco.W OnReceive klasy socket, wywołanie metody CAsyncSocket::IOCtl(FIONREAD, ...) przed wywołaniem Serialize metoda klasy wiadomości, gdy oczekiwane dane odczytywane z gniazda przekracza rozmiar jeden pakiet TCP (maksymalna jednostka transmisji z nośnika sieci, zwykle co najmniej 1096 bajtów).Jeśli rozmiar danych jest mniejsza niż jest to potrzebne, czekać na wszystkie dane, aby być odebrane i dopiero wtedy uruchomić operacji odczytu.
W poniższym przykładzie m_dwExpected jest przybliżoną liczbę bajtów, które użytkownik spodziewa się otrzymywać.Zakłada się, że należy zadeklarować to gdzie indziej w kodzie.
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
}
}
[!UWAGA]
Podczas korzystania z gniazda MFC w dodatkowych wątków w aplikacji MFC statycznie, trzeba wywołać AfxSocketInit w każdym wątku, który używa gniazda zainicjować biblioteki gniazd.Domyślnie AfxSocketInit jest wywoływana tylko w wątku głównego.
Aby uzyskać więcej informacji, zobacz Windows Sockets MFC, Windows Sockets: za pomocą gniazd z archiwum, Windows Sockets: jak gniazda z archiwów pracy, Windows Sockets: Sekwencja operacji, Windows Sockets: przykład z gniazda za pomocą archiwum.
Hierarchia dziedziczenia
CSocket
Wymagania
Nagłówek: afxsock.h