Сокеты Windows. Использование класса CAsyncSocketWindows Sockets: Using Class CAsyncSocket

В этой статье объясняется, как использовать класс CAsyncSocket.This article explains how to use class CAsyncSocket. Имейте в виду, что этот класс инкапсулирует API Windows Sockets на очень низком уровне.Be aware that this class encapsulates the Windows Sockets API at a very low level. CAsyncSocket предназначен для использования программистами, которые узнают о сетевом взаимодействии, но хотят использовать обратные вызовы для уведомления о сетевых событиях.CAsyncSocket is for use by programmers who know network communications in detail but want the convenience of callbacks for notification of network events. Основываясь на этом предположении, в этой статье содержится только основная инструкция.Based on this assumption, this article provides only basic instruction. Вы, вероятно, рассмотрите возможность использования, CAsyncSocket Если вы хотите, чтобы использование сокетов Windows было удобным для работы с несколькими сетевыми протоколами в приложении MFC, но не хотите пожертвовать гибкостью.You should probably consider using CAsyncSocket if you want Windows Sockets' ease of dealing with multiple network protocols in an MFC application but do not want to sacrifice flexibility. Кроме того, вы можете получить лучшую эффективность благодаря более эффективному программированию взаимодействия, чем использовать более общую альтернативную модель класса CSocket .You might also feel that you can get better efficiency by programming the communications more directly yourself than you could using the more general alternative model of class CSocket.

CAsyncSocket описывается в справочнике по MFC.CAsyncSocket is documented in the MFC Reference. Visual C++ также предоставляет спецификацию сокетов Windows, расположенную в Windows SDK.Visual C++ also supplies the Windows Sockets specification, located in the Windows SDK. Сведения отправляются по левому краю.The details are left to you. Visual C++ не предоставляет пример приложения для CAsyncSocket .Visual C++ does not supply a sample application for CAsyncSocket.

Если вы не обладаете широкими знаниями о сетевых подключениях и хотите использовать простое решение, используйте класс CSocket с CArchive объектом.If you are not highly knowledgeable about network communications and want a simple solution, use class CSocket with a CArchive object. Дополнительные сведения см. в разделе сокеты Windows: Использование сокетов с архивами .See Windows Sockets: Using Sockets with Archives for more information.

В этой статье рассматриваются следующие вопросы:This article covers:

Создание и использование объекта CAsyncSocketCreating and Using a CAsyncSocket Object

Использование CAsyncSocketTo use CAsyncSocket

  1. Создайте объект CAsyncSocket и используйте объект для создания базового маркера сокета .Construct a CAsyncSocket object and use the object to create the underlying SOCKET handle.

    Создание сокета соответствует шаблону MFC для создания двух этапов.Creation of a socket follows the MFC pattern of two-stage construction.

    Пример:For example:

    CAsyncSocket* pSocket = new CAsyncSocket;
    int nPort = 27;
    pSocket->Create( nPort, SOCK_DGRAM );					
    

    -или--or-

    CAsyncSocket *pSocket = new CAsyncSocket;
    int nPort = 27;
    pSocket->Create(nPort, SOCK_DGRAM);
    

    Первый приведенный выше конструктор создает CAsyncSocket объект в стеке.The first constructor above creates a CAsyncSocket object on the stack. Второй конструктор создает объект CAsyncSocket в куче.The second constructor creates a CAsyncSocket on the heap. Первый вызов CREATE выше использует параметры по умолчанию для создания сокета потока.The first Create call above uses the default parameters to create a stream socket. Второй Create вызов создает сокет датаграммы с указанным портом и адресом.The second Create call creates a datagram socket with a specified port and address. (Можно использовать любую из Create версий с любым методом создания.)(You can use either Create version with either construction method.)

    Параметры Create :The parameters to Create are:

    • "Port": короткое целое число.A "port": a short integer.

      Для сокета сервера необходимо указать порт.For a server socket, you must specify a port. Для сокета клиента обычно принимается значение по умолчанию для этого параметра, что позволяет использовать сокеты Windows для выбора порта.For a client socket, you typically accept the default value for this parameter, which lets Windows Sockets select a port.

    • Тип сокета: SOCK_STREAM (по умолчанию) или SOCK_DGRAM.A socket type: SOCK_STREAM (the default) or SOCK_DGRAM.

    • Адрес сокета, например "ftp.microsoft.com" или "128.56.22.8".A socket "address," such as "ftp.microsoft.com" or "128.56.22.8".

      Это IP-адрес в сети.This is your Internet Protocol (IP) address on the network. Вы, вероятно, всегда полагаетесь на значение по умолчанию для этого параметра.You will probably always rely on the default value for this parameter.

    Термины "порт" и "адрес сокета" описаны в подокнах сокетов Windows: порты и адреса сокетов.The terms "port" and "socket address" are explained in Windows Sockets: Ports and Socket Addresses.

  2. Если сокет является клиентом, подключите объект сокета к сокету сервера с помощью CAsyncSocket:: Connect.If the socket is a client, connect the socket object to a server socket, using CAsyncSocket::Connect.

    -или--or-

    Если сокет является сервером, задайте для сокета начало прослушивания (с помощью CAsyncSocket:: Listen) для попыток подключения клиента.If the socket is a server, set the socket to begin listening (with CAsyncSocket::Listen) for connect attempts from a client. После получения запроса на подключение примите его с помощью CAsyncSocket:: Accept.Upon receiving a connection request, accept it with CAsyncSocket::Accept.

    После принятия подключения можно выполнять такие задачи, как проверка паролей.After accepting a connection, you can perform such tasks as validating passwords.

    Примечание

    AcceptФункция-член принимает ссылку на новый пустой CSocket объект в качестве параметра.The Accept member function takes a reference to a new, empty CSocket object as its parameter. Этот объект необходимо создать перед вызовом метода Accept .You must construct this object before you call Accept. Если этот объект сокета выходит за пределы области действия, соединение закрывается.If this socket object goes out of scope, the connection closes. Не вызывайте Create этот новый объект сокета.Do not call Create for this new socket object. Пример см. в статье сокеты Windows: последовательность операций.For an example, see the article Windows Sockets: Sequence of Operations.

  3. Выполните обмен данными с другими сокетами, вызвав CAsyncSocket функции-члены объекта, которые инкапсулируют функции API сокетов Windows.Carry out communications with other sockets by calling the CAsyncSocket object's member functions that encapsulate the Windows Sockets API functions.

    См. спецификацию сокетов Windows и класс CAsyncSocket в справочнике по MFC.See the Windows Sockets specification and class CAsyncSocket in the MFC Reference.

  4. Удалите CAsyncSocket объект.Destroy the CAsyncSocket object.

    Если объект сокета был создан в стеке, его деструктор вызывается, когда содержащая ее функция выходит за пределы области.If you created the socket object on the stack, its destructor is called when the containing function goes out of scope. Если вы создали объект сокета в куче с помощью new оператора, вы несете ответственность за использование delete оператора для уничтожения объекта.If you created the socket object on the heap, using the new operator, you are responsible for using the delete operator to destroy the object.

    Перед уничтожением объекта деструктор вызывает функцию закрытия элемента объекта.The destructor calls the object's Close member function before destroying the object.

Пример этой последовательности в коде (на самом деле для CSocket объекта) см. в разделе сокеты Windows: последовательность операций.For an example of this sequence in code (actually for a CSocket object), see Windows Sockets: Sequence of Operations.

Ваши обязанности с CAsyncSocketYour Responsibilities with CAsyncSocket

При создании объекта класса CAsyncSocketобъект инкапсулирует маркер Windows Socket и предоставляет операции с этим маркером.When you create an object of class CAsyncSocket, the object encapsulates a Windows SOCKET handle and supplies operations on that handle. При использовании вы CAsyncSocket должны иметь дело со всеми проблемами, которые могут возникнуть при непосредственном использовании API.When you use CAsyncSocket, you must deal with all the issues you might face if using the API directly. Пример:For example:

  • Сценарии блокировки."Blocking" scenarios.

  • Различия порядка байтов между отправляющей и принимающей машинами.Byte order differences between the sending and receiving machines.

  • Преобразование между строками Юникода и многобайтовой кодировкой (MBCS).Converting between Unicode and multibyte character set (MBCS) strings.

Определения этих терминов и дополнительные сведения см. в статьях сокеты Windows: Блокировка, сокеты Windows: порядок байтов, сокеты Windows: преобразование строк.For definitions of these terms and additional information, see Windows Sockets: Blocking, Windows Sockets: Byte Ordering, Windows Sockets: Converting Strings.

Несмотря на эти проблемы, класс CAsycnSocket может быть правильным выбором, если ваше приложение требует всей гибкости и управления, которые можно получить.Despite these issues, class CAsycnSocket may be the right choice for you if your application requires all the flexibility and control you can get. Если нет, вместо этого следует использовать класс CSocket .If not, you should consider using class CSocket instead. CSocket скрывает от вас много деталей: он переносит сообщения Windows во время блокирующих вызовов и предоставляет вам доступ к CArchive , который управляет различиями порядка байтов и преобразованием строк.CSocket hides a lot of detail from you: it pumps Windows messages during blocking calls and gives you access to CArchive, which manages byte order differences and string conversion for you.

Дополнительные сведения см. в разделе:For more information, see:

См. также разделSee also

Сокеты Windows в MFCWindows Sockets in MFC