Класс CSocket
Наследуется от CAsyncSocket, наследует инкапсуляцию API Windows sockets и представляет более высокий уровень абстракции, чем из объекта CAsyncSocket.
class CSocket : public CAsyncSocket
Члены
Открытые конструкторы
Имя |
Описание |
---|---|
Создает объект CSocket. |
Открытые методы
Имя |
Описание |
---|---|
Вложение дескриптор СОКЕТ к объекту CSocket. |
|
Отменяет блокирующий вызов, который в данный момент. |
|
Создает сокет. |
|
Возвращает указатель на объект CSocket заданный дескриптор СОКЕТ. |
|
Определяет, является ли блокирующий вызов выполняется. |
Защищенные методы
Имя |
Описание |
---|---|
Вызываемый для обработки ожидающих сообщений при ожидании блокирующий вызов, чтобы завершить. |
Заметки
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: Пример сокетов использование файлов.
Иерархия наследования
CSocket
Требования
заголовок: afxsock.h