C# 在C中使用WSAEventSelect时发生套接字错误

C# 在C中使用WSAEventSelect时发生套接字错误,c#,networking,C#,Networking,在使用WSAEventSelect函数处理网络事件时出现问题,代码如下: WSAEventSelect的定义是: FD_READ和FD_CLOSE的定义还包括: public const int FD_READ_BIT = 0; public const int FD_READ = (1 << FD_READ_BIT); public const int FD_CLOSE_BIT = 5; public const int FD_CLOSE = (1 << FD_CLOS

在使用WSAEventSelect函数处理网络事件时出现问题,代码如下:

WSAEventSelect的定义是:

FD_READ和FD_CLOSE的定义还包括:

public const int FD_READ_BIT = 0;
public const int FD_READ = (1 << FD_READ_BIT);
public const int FD_CLOSE_BIT = 5;
public const int FD_CLOSE = (1 << FD_CLOSE_BIT);
WSAEventSelect函数的返回错误为-1,最后一个错误为:10038,称为:WSAENOTSOCK

请指教


谢谢

错误消息非常清楚:您传递了一个无效的套接字句柄。您是如何初始化m_clientSocket的?更重要的是,既然.NET已经有很好的托管网络API,为什么还要使用本机Winsock API?这是第一次在C中使用网络API,1:m_ClientSocket由另一个函数m_ClientSocket=Socket.EndAcceptor初始化,看起来m_ClientSocket已经初始化,所以我不确定这里出了什么问题;2:你介意告诉我如何使用.NET网络API监控网络事件吗?thanksMSDN提供了有关正确使用Socket类的全面文档,其中不包括尝试将.NET Socket实例作为非托管套接字句柄传递给非托管函数,web上有许多示例,包括这里的堆栈溢出。Socket类有两种不同的异步范例Begin/EndXXX和XXXAsync,您可以使用NetworkStream来使用更现代的基于C异步/等待的范例。
[DllImport("Ws2_32.dll")]
public static extern int WSAEventSelect(Socket s, EventWaitHandle e, int eventType);
public const int FD_READ_BIT = 0;
public const int FD_READ = (1 << FD_READ_BIT);
public const int FD_CLOSE_BIT = 5;
public const int FD_CLOSE = (1 << FD_CLOSE_BIT);