Поделиться через


Класс CSocket

Наследуется от CAsyncSocket, наследует инкапсуляцию API Windows sockets и представляет более высокий уровень абстракции, чем из объекта CAsyncSocket.

class CSocket : public CAsyncSocket

Члены

wxzt95kb.collapse_all(ru-ru,VS.110).gifОткрытые конструкторы

Имя

Описание

CSocket::CSocket

Создает объект CSocket.

wxzt95kb.collapse_all(ru-ru,VS.110).gifОткрытые методы

Имя

Описание

CSocket::Attach

Вложение дескриптор СОКЕТ к объекту CSocket.

CSocket::CancelBlockingCall

Отменяет блокирующий вызов, который в данный момент.

CSocket::Create

Создает сокет.

CSocket::FromHandle

Возвращает указатель на объект CSocket заданный дескриптор СОКЕТ.

CSocket::IsBlocking

Определяет, является ли блокирующий вызов выполняется.

wxzt95kb.collapse_all(ru-ru,VS.110).gifЗащищенные методы

Имя

Описание

CSocket::OnMessagePending

Вызываемый для обработки ожидающих сообщений при ожидании блокирующий вызов, чтобы завершить.

Заметки

CSocket работает с классами CSocketFile и CArchive для управления отправки и получения данных.

Объект CSocket предоставляет также отключить, который необходим для синхронной операции CArchive.Блокировка действует, как Receive, Send, ReceiveFrom, SendTo и Accept (все), унаследованное от CAsyncSocket не возвращает ошибку WSAEWOULDBLOCK в CSocket.Вместо этого эти функции будут ожидать, пока операция не завершится.Кроме того, вызов завершает исходный ошибка WSAEINTR если CancelBlockingCall вызываются, пока этих функций отключить.

Чтобы использовать объект CSocket, вызовите конструктор, то вызов Create чтобы создать основной маркер SOCKET (тип SOCKET).Параметры по умолчанию Create создает сокет потока, но если не используется, когда сокет с объектом CArchive, то можно указать параметр для создания сокет датаграмм вместо или привязать к конкретному порту для создания сокета сервера.Подключитесь к гнезду клиента с помощью ConnectAccept на стороне клиента и на стороне сервера.Затем создайте объект CSocketFile и свяжите его к объекту CSocket в конструкторе CSocketFile.Затем создайте объект CArchive для отправки и получения данные (например, требуется), а затем связать их с объектом CSocketFile в конструкторе CArchive.При поступлении завершены, destroy CArchive, CSocketFile и объекты CSocket.Тип данных SOCKET описана в статье Windows sockets: фон.

При использовании CArchive с CSocketFile и CSocket, может возникнуть ситуация, когда CSocket::Receive вводит цикл ( PumpMessages(FD_READ)) ожидания количество запрошенных байтов.Это происходит потому, что Windows sockets допускают только один вызов recv в уведомление FD_READ, но CSocketFile и CSocket допускают несколько вызовов recv в FD_READ.Если получено FD_READ при отсутствии данных для чтения, приложение висит.Если вы не получаете другое FD_READ, то выполнение приложения остановится взаимодействия через гнездом.

Можно разрешить эту проблему следующим образом.В методе OnReceive класса сокета, вызов CAsyncSocket::IOCtl(FIONREAD, ...) до вызова метода Serialize класса сообщений, когда требуемые данные, считываемых из одного сокета превышает размер пакета TCP (MTU носитель сети, обычно не менее 1096 байт).Если размер доступные данные меньше требуется подождите все данные, которые требуется получить, и только затем начать операцию чтения.

В следующем примере m_dwExpected приблизительное число байтов, которые пользователь ожидает получения.Требуется объявить его в другом месте в коде.

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
   }
}
ПримечаниеПримечание

При использовании сокетов MFC в статической вторичных потоков в связанном приложении MFC, необходимо вызвать AfxSocketInit в каждом потоке, который использует сокета для инициализации библиотеки сокета.По умолчанию AfxSocketInit вызываются только в основном потоке.

Дополнительные сведения см. в разделе Windows sockets в MFC, Windows sockets: Использование сокета с архивами, Windows sockets: Как работают с архивами сокета, Windows sockets: последовательность операций, Windows sockets: Пример сокетов использование файлов.

Иерархия наследования

CObject

CAsyncSocket

CSocket

Требования

заголовок: afxsock.h

См. также

Ссылки

Класс CAsyncSocket

Диаграмма иерархии

Класс CAsyncSocket

Класс CSocketFile