Функция ioctlsocket (winsock.h)
Функция ioctlsocket управляет режимом ввода-вывода сокета.
Синтаксис
int ioctlsocket(
[in] SOCKET s,
[in] long cmd,
[in, out] u_long *argp
);
Параметры
[in] s
Дескриптор, определяющий сокет.
[in] cmd
Команда, выполняемая в сокете. См . раздел Winsock IOCTLs.
[in, out] argp
Указатель на параметр для cmd.
Возвращаемое значение
После успешного завершения функция ioctlsocket возвращает ноль. В противном случае возвращается значение SOCKET_ERROR, а определенный код ошибки можно получить, вызвав WSAGetLastError.
Код ошибки | Значение |
---|---|
Перед использованием этой функции должен быть выполнен успешный вызов WSAStartup . | |
Произошел сбой сетевой подсистемы. | |
Выполняется блокирующий вызов Windows Sockets 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова. | |
Дескриптор s не является сокетом. | |
Параметр argp не является допустимой частью адресного пространства пользователя. |
Комментарии
Функцию ioctlsocket можно использовать в любом сокете в любом состоянии. Он используется для задания или извлечения некоторых операционных параметров, связанных с сокетом, независимо от протокола и подсистемы связи. Ниже приведены поддерживаемые команды для использования в параметре cmd и их семантика:
Функция WSAIoctl используется для задания или получения операционных параметров, связанных с сокетом, транспортным протоколом или подсистемой связи.
Функция WSAIoctl более мощная, чем функция ioctlsocket , и поддерживает большое количество возможных значений для задания или извлечения рабочих параметров.
Пример кода
В следующем примере показано использование функции ioctlsocket .
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
void main()
{
//-------------------------
// Initialize Winsock
WSADATA wsaData;
int iResult;
u_long iMode = 0;
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
printf("Error at WSAStartup()\n");
//-------------------------
// Create a SOCKET object.
SOCKET m_socket;
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_socket == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return;
}
//-------------------------
// Set the socket I/O mode: In this case FIONBIO
// enables or disables the blocking mode for the
// socket based on the numerical value of iMode.
// If iMode = 0, blocking is enabled;
// If iMode != 0, non-blocking mode is enabled.
iResult = ioctlsocket(m_socket, FIONBIO, &iMode);
if (iResult != NO_ERROR)
printf("ioctlsocket failed with error: %ld\n", iResult);
}
Совместимости
Эта функция ioctlsocket выполняет только подмножество функций в сокете по сравнению с функцией ioctl , найденной в сокетах Беркли. Функция ioctlsocket не имеет параметра команды, эквивалентного FIOASYNC ioctl, а SIOCATMARK — единственная команда уровня сокета, поддерживаемая ioctlsocket.Windows Phone 8. Эта функция поддерживается для приложений Магазина Windows Phone Windows Phone 8 и более поздних версий.
Windows 8.1 и Windows Server 2012 R2. Эта функция поддерживается для приложений Магазина Windows в Windows 8.1, Windows Server 2012 R2 и более поздних версий.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 8.1, Windows Vista [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2003 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | winsock.h (включая Winsock2.h) |
Библиотека | Ws2_32.lib |
DLL | Ws2_32.dll |