Клас CSocket, Microsoft Docs

Успадковується відCAsyncSocket, успадковує інкапсуляцію API Windows sockets і представляє вищий рівень абстракції, ніж з об'єкта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. При надходженні завершено, destroyCArchive,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 приблизно байтів, які користувач очікує отримання. Потрібно оголосити його в іншому місці коду.

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