Функция WSASendMsg (winsock2.h)
Функция WSASendMsg отправляет данные и необязательные сведения об элементе управления из подключенных и неподключенных сокетов.
Синтаксис
int WSAAPI WSASendMsg(
[in] SOCKET Handle,
[in] LPWSAMSG lpMsg,
[in] DWORD dwFlags,
[out] LPDWORD lpNumberOfBytesSent,
[in] LPWSAOVERLAPPED lpOverlapped,
[in] LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
Параметры
[in] Handle
Дескриптор, определяющий сокет.
[in] lpMsg
Структура WSAMSG хранения структуры Posix.1g msghdr.
[in] dwFlags
Флаги, используемые для изменения поведения вызова функции WSASendMsg. Дополнительные сведения см. в разделе "Использование dwFlags" в разделе "Примечания".
[out] lpNumberOfBytesSent
Указатель на номер в байтах, отправленный этим вызовом, если операция ввода-вывода завершается немедленно.
Используйте NULL для этого параметра, если параметр lpOverlapped не NULL, чтобы избежать потенциально ошибочных результатов. Этот параметр может быть NULL только в том случае, если параметр lpOverlapped не NULL.
[in] lpOverlapped
Указатель на структуру WSAOVERLAPPED. Игнорируется для не перекрывающихся сокетов.
[in] lpCompletionRoutine
Тип: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE
Указатель на подпрограмму завершения, вызываемую после завершения операции отправки. Игнорируется для не перекрывающихся сокетов.
Возвращаемое значение
Возвращает ноль, когда происходит успешное и немедленное завершение. При возврате нуля указанная подпрограмма завершения вызывается, когда вызывающий поток находится в состоянии оповещений.
Возвращаемое значение SOCKET_ERRORи последующий вызов WSAGetLastError, возвращающий WSA_IO_PENDING, указывает, что перекрывающаяся операция успешно инициирована; Затем выполняется указание с помощью других средств, таких как события или порты завершения.
После сбоя возвращает SOCKET_ERROR и последующий вызов WSAGetLastError возвращает значение, отличное от WSA_IO_PENDING. В следующей таблице перечислены коды ошибок.
Код ошибки | Значение |
---|---|
Запрошенный адрес является широковещательным адресом, но соответствующий флаг не задан. | |
Для сокета диаграммы UDP эта ошибка указывает на то, что предыдущая операция отправки привела к сообщению ICMP "Port Unreachable". | |
lpMsg, lpNumberOfBytesSent, lpOverlappedили параметр lpCompletionRoutine не полностью содержится в допустимой части адресного пространства пользователя. Эта ошибка также возвращается, если элемент имени |
|
Выполняется блокировка вызова сокетов Windows 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова. | |
Блокировка вызова Сокета Windows 1.1 была отменена через WSACancelBlockingCall. | |
Сокет не привязан к привязкеили сокет не был создан с перекрывающимся флагом. | |
Сокет ориентирован на сообщение, и сообщение больше максимального, поддерживаемого базовым транспортом. | |
Сбой сетевой подсистемы. | |
Для сокета диаграммы данных эта ошибка указывает, что срок жизни истек. | |
Сеть недоступна. | |
Поставщик сокетов Windows сообщает о взаимоблокировке буфера. | |
Сокет не подключен. | |
Дескриптор не является сокетом. | |
Операция сокета не поддерживается. Эта ошибка возвращается, если dwFlags член структуры WSAMSG, на которую указывает параметр lpMsg, содержит любые флаги управления, недопустимые для WSASendMsg. | |
Сокет был выключен; Невозможно вызвать функцию |
|
Время ожидания сокета истекло. Эта ошибка возвращается, если у сокета было время ожидания, указанное с помощью параметра SO_SNDTIMEO сокета и превышено время ожидания. | |
Перекрывающиеся сокеты: слишком много невыполненных запросов ввода-вывода. Нерабочие сокеты: сокет помечается как неблокировка и операция отправки не может быть завершена немедленно. | |
Перед использованием этой функции необходимо выполнить успешный вызов WSAStartup. | |
Операция, перекрываемая, была успешно инициирована, а завершение будет указано позже. | |
Перекрываемая операция была отменена из-за закрытия сокета или из-за выполнения команды SIO_FLUSH в WSAIoctl. |
Замечания
Функцию WSASendMsg можно использовать вместо функций WSASend и WSASendTo. Функцию WSASendMsg можно использовать только с диаграммами данных и необработанными сокетами. Дескриптор сокета в параметре
Параметр
Перекрывающиеся сокеты создаются с вызовом функции WSASocket с набором флагов WSA_FLAG_OVERLAPPED. Для перекрывающихся сокетов отправка данных использует перекрывающиеся операции ввода-вывода, если только lpOverlapped и lpCompletionRoutineNULL; если lpOverlapped и lpCompletionRoutineNULL, сокет обрабатывается как невернутый сокет. Указание завершения происходит с перекрывающимися сокетами; После того как буфер или буферы были использованы транспортом, активируется подпрограмма завершения или устанавливается объект события. Если операция не завершается немедленно, конечный статус завершения извлекается через подпрограмму завершения или вызывая функцию WSAGetOverlappedResult.
Для неперекрывающихся сокетов lpOverlapped и lpCompletionRoutine параметры игнорируются и WSASendMsg принимает ту же семантику блокировки, что и функция отправки: данные копируются из буфера или буферов в буфер транспорта. Если сокет неблокируется и ориентирован на поток, а в буфере транспорта недостаточно места, WSASendMsg возвращается только часть буферов приложения, которые были использованы. В отличие от этого, эта ситуация буфера в сокете блокировки приводит к блокировке WSASendMsg до тех пор, пока не будет использоваться все содержимое буфера приложения.
Если эта функция завершена перекрывающимся способом, перед возвращением из этого вызова поставщик услуг Winsock несет ответственность за запись этой структуры WSABUF. Это позволяет приложениям создавать массивы
Для сокетов, ориентированных на сообщения, необходимо не превышать максимальный размер сообщения базового поставщика, который можно получить, получив значение параметра сокета SO_MAX_MSG_SIZE. Если данные слишком долго передаются через базовый протокол, возвращается ошибка WSAEMSGSIZE, и данные не передаются.
В сокете IPv4 типа SOCK_DGRAM или SOCK_RAWприложение может указать локальный IP-адрес, используемый для отправки с функцией WSASendMsg. Один из объектов данных управления, передаваемых в структуре WSAMSG в функцию WSASendMsg, может содержать структуру in_pktinfo, используемую для указания локального исходного адреса IPv4 для отправки.
В сокете IPv6 типа SOCK_DGRAM или SOCK_RAWприложение может указать локальный исходный IP-адрес для отправки с функцией WSASendMsg. Один из объектов данных управления, передаваемых в структуре WSAMSG в функцию WSASendMsg, может содержать структуру in6_pktinfo, используемую для указания локального исходного адреса IPv6 для отправки.
Для сокета с двумя стеками при отправке данных с помощью функции WSASendMsg и приложение хочет указать конкретный локальный IP-адрес источника, метод обработки этого зависит от целевого IP-адреса. При отправке в адрес назначения IPv4 или ipPv4-сопоставленный адрес назначения IPv6 один из объектов данных управления, передаваемых в структуре WSAMSG, на которую указывает параметр lpMsg, должен содержать структуру in_pktinfo, содержащую локальный исходный адрес IPv4, используемый для отправки. При отправке в адрес назначения IPv6, который не является ipPv4-сопоставленным IPv6-адресом, один из объектов данных управления, переданных в структуре WSAMSG, на которую указывает параметр lpMsg, должен содержать in6_pktinfo структуру, содержащую локальный исходный адрес IPv6, используемый для отправки.
dwFlags
Параметр dwFlags входных данных можно использовать для влияния на поведение вызова функции за пределами параметров, указанных для связанного сокета. То есть семантика этой функции определяется параметрами сокета и параметром dwFlags. Последний создается с помощью побитового оператора OR с любым из следующих значений.В выходных данных элемент dwFlags структуры WSAMSG, на которую указывает параметр lpMsg, не используется.
перекрытие ввода-вывода сокета
Если перекрывающаяся операция завершается немедленно, WSASendMsg возвращает значение нуля, а параметр lpNumberOfBytesSent обновляется с числом отправленных байтов. Если перекрывающаяся операция успешно инициируется и завершится позже, WSASendMsg возвращает SOCKET_ERROR и указывает код ошибки WSA_IO_PENDING. В этом случае lpNumberOfBytesSent не обновляется. После завершения операции перекрытия объем передаваемых данных указывается либо с помощью параметра cbTransferred в подпрограмме завершения (если указано), либо через параметр lpcbTransfer в WSAGetOverlappedResult.Функция
Параметр lpOverlapped должен быть допустимым в течение операции перекрытия. Если несколько операций ввода-вывода одновременно не выполняются, каждая из них должна ссылаться на отдельную структуру WSAOVERLAPPED.
Если параметр lpCompletionRoutineNULL, параметр hEventlpOverlapped сигнализирует, когда операция перекрывается, если она содержит допустимый дескриптор объекта события. Приложение может использовать WSAWaitForMultipleEvents или WSAGetOverlappedResult для ожидания или опроса объекта события.
Если lpCompletionRoutine не NULL, параметр hEvent игнорируется и может использоваться приложением для передачи сведений о контексте в подпрограмму завершения. Вызывающий объект, который передает
Подпрограмма завершения соответствует тем же правилам, что и для подпрограмм завершения ввода-вывода файлов Windows. Подпрограмма завершения не будет вызываться до тех пор, пока поток не находится в состоянии ожидания оповещения, например, с WSAWaitForMultipleEvents вызывается с параметром fAlertable значение TRUE.
Поставщики транспорта позволяют приложению вызывать операции отправки и получения из контекста подпрограммы завершения ввода-вывода сокета и гарантировать, что для заданного сокета подпрограммы завершения ввода-вывода не будут вложены. Это позволяет передавать конфиденциальные данные во времени полностью в контексте предварительной защиты.
Прототип подпрограммы завершения выглядит следующим образом.
void CALLBACK CompletionRoutine(
IN DWORD dwError,
IN DWORD cbTransferred,
IN LPWSAOVERLAPPED lpOverlapped,
IN DWORD dwFlags
);
Функция CompletionRoutine является заполнителем для определяемого приложением или библиотекой имени функции. Параметр dwError
Возврат из этой функции позволяет выполнять вызов другой подпрограммы завершения ожидания для сокета. Все подпрограммы завершения ожидания вызываются до того, как ожидание оповещенного потока удовлетворено возвращаемым кодом WSA_IO_COMPLETION. Подпрограммы завершения можно вызывать в любом порядке, не обязательно в том же порядке, что и операции, перекрывающиеся. Однако размещенные буферы гарантированно отправляются в том же порядке, что и они указаны.
Windows 8.1 и Windows Server 2012 R2: эта функция поддерживается для приложений Магазина Windows в Windows 8.1, Windows Server 2012 R2 и более поздних версий.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows 8.1, Windows Vista [классические приложения | Приложения UWP] |
минимальный поддерживаемый сервер | Windows Server 2008 [классические приложения | Приложения UWP] |
целевая платформа | Виндоус |
заголовка | winsock2.h (include Mswsock.h) |
библиотеки |
Ws2_32.lib |
DLL | Ws2_32.dll |
См. также
Справочник