ioctlsocket 函数 (winsock.h)

ioctlsocket 函数控制套接字的 I/O 模式。

语法

int ioctlsocket(
  [in]      SOCKET s,
  [in]      long   cmd,
  [in, out] u_long *argp
);

参数

[in] s

标识套接字的描述符。

[in] cmd

对套接字执行的命令。 请参阅 Winsock IOCTL

[in, out] argp

指向 cmd 参数的指针。

返回值

成功完成后, ioctlsocket 返回零。 否则,将返回值 SOCKET_ERROR,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。

错误代码 含义
WSANOTINITIALISED
在使用此函数之前,必须成功调用 WSAStartup
WSAENETDOWN
网络子系统失败。
WSAEINPROGRESS
阻止 Windows Sockets 1.1 调用正在进行,或者服务提供程序仍在处理回调函数。
WSAENOTSOCK
描述符 不是 套接字。
WSAEFAULT
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);
  

}

兼容性

与伯克利套接字中的 ioctl 函数相比,此 ioctlsocket 函数仅对套接字执行一部分函数。 ioctlsocket 函数没有等效于 ioctl 的 FIOASYNC 的命令参数,并且 SIOCATMARK 是 ioctlsocket 支持的唯一套接字级命令。

Windows Phone 8:Windows Phone 8 及更高版本上的 Windows Phone 应用商店应用支持此函数。

Windows 8.1Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持此函数。

要求

要求
最低受支持的客户端 Windows 8.1、Windows Vista [桌面应用 |UWP 应用]
最低受支持的服务器 Windows Server 2003 [桌面应用 | UWP 应用]
目标平台 Windows
标头 winsock.h (包括 Winsock2.h)
Library Ws2_32.lib
DLL Ws2_32.dll

另请参阅

WSAAsyncSelect

WSAEventSelect

WSAIoctl

Winsock 函数

Winsock 参考

getsockopt

setsockopt

socket