Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ WINSOCK2 WSAAsyncSelect已弃用问题_C++_Sockets_Winapi_Asynchronous - Fatal编程技术网

C++ WINSOCK2 WSAAsyncSelect已弃用问题

C++ WINSOCK2 WSAAsyncSelect已弃用问题,c++,sockets,winapi,asynchronous,C++,Sockets,Winapi,Asynchronous,嗨,我正在使用winsock2,我正在尝试获得异步通信。 我试过了,正在等待接受 我尝试了在侦听功能之前使用 WSAAsyncSelect(ListenSocket, m_hWnd, WM_SOCKET, (FD_CLOSE | FD_ACCEPT | FD_READ)); 并显示以下错误 Error C4996 'WSAAsyncSelect': Use WSAEventSelect() instead or define _WINSO

嗨,我正在使用winsock2,我正在尝试获得异步通信。 我试过了,正在等待接受

我尝试了在侦听功能之前使用

WSAAsyncSelect(ListenSocket,
        m_hWnd,
        WM_SOCKET,
        (FD_CLOSE | FD_ACCEPT | FD_READ));
并显示以下错误

Error   C4996   'WSAAsyncSelect': Use WSAEventSelect() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings 

我怎样才能解决这个问题。。提前谢谢

要消除该警告,您可以定义
\define\u WINSOCK\u DEPRECATED\u NO\u警告
位于源文件顶部,这将禁用三种类型的警告

这就是说,也许值得听听这个警告并改用它。 因为
WSAEventSelect
发出事件信号,而不是将消息发布到窗口的消息队列中,这就是它的作用。投递到消息队列的速度较慢,并且添加了实际上不需要的额外处理

我有一个例子,我将在这里为您发布:
... 我可能太过火了。。。但这一切都是有用和相关的

设置侦听套接字 从套接字处理事件 处理事件。
要消除该警告,您可以定义
#define _WINSOCK_DEPRECATED_NO_警告
位于源文件顶部,这将禁用三种类型的警告

这就是说,也许值得听听这个警告并改用它。 因为
WSAEventSelect
发出事件信号,而不是将消息发布到窗口的消息队列中,这就是它的作用。投递到消息队列的速度较慢,并且添加了实际上不需要的额外处理

我有一个例子,我将在这里为您发布:
... 我可能太过火了。。。但这一切都是有用和相关的

设置侦听套接字 从套接字处理事件 处理事件。
您是否尝试过执行错误消息建议的操作?也就是说,正在研究函数?@JoachimPileborg是的,现在我正在研究它。。我只是想知道我可以用什么方式使用
WSAAsyncSelect
。bcz我有一个pgm fr示例,..然后错误消息也会告诉您如何执行该操作。@JoachimPileborg我在winsock2头之后尝试了定义。现在它正在工作(y)您是否尝试过执行错误消息建议的操作?也就是说,正在研究函数?@JoachimPileborg是的,现在我正在研究它。。我只是想知道我可以用什么方式使用
WSAAsyncSelect
。bcz我有一个pgm fr示例,..然后错误消息也会告诉您如何执行该操作。@JoachimPileborg我在winsock2头之后尝试了定义。现在它正在工作(y)@VivekAnanthan谢谢,我希望它非常有用,我不得不删去很多代码使它足够简单,所以把它作为一个使用示例,而不是一个完全工作的示例,你应该做得很好;将Async替换为Event意味着,如果希望窗口应用程序保持响应,则必须自己管理事件列表,并将消息循环更改为使用MsgWaitForMultipleEvents(),而不是您正在执行的任何操作(这也意味着没有DialogBox(),因此,如果您使用EndDialog(),则现在也需要更改它…)WSAEventSelect可能适合于控制台应用程序(即使如此,等待控制台也有其自身的问题),但异步绝对是窗口应用程序的最佳选择!您好@Medinoc如果您觉得Microsoft犯了错误,并且您有了更好的答案,请随意在这个问题中发布答案,以便您能够正确地解释原因并给出示例。@VivekAnanthan谢谢,我希望它非常有用,我不得不删减大量代码,使其足够简单,因此将其作为一个使用示例,而不是一个完全有效的示例,您应该会做得很好;将Async替换为Event意味着,如果希望窗口应用程序保持响应,则必须自己管理事件列表,并将消息循环更改为使用MsgWaitForMultipleEvents(),而不是您正在执行的任何操作(这也意味着没有DialogBox(),因此,如果您使用EndDialog(),则现在也需要更改它…)WSAEventSelect可能适合于控制台应用程序(即使如此,等待控制台也有其自身的问题),但异步绝对是窗口应用程序的最佳选择!Hi@Medinoc如果您觉得Microsoft犯了错误,并且您有了更好的答案,请随意在这个问题中发布答案,以便您能够正确地解释原因并给出示例。
if ( socket_name == INVALID_SOCKET )
{
    P_ERR( "Could not create socket ( Id: %d ): %d\n", id, WSAGetLastError() );
    return INVALID_SOCKET;
}

rerror = bind( socket_name, (SOCKADDR*)&sock_addr, sizeof( sock_addr ) );
if ( rerror != SOCKET_ERROR )
{
    rerror = listen( socket_name, MAX_LISTEN_QUEUE );

    if ( rerror != SOCKET_ERROR )
    {
        /* Selects the events that will trigger the `socket_event` windows event. */
        /* socket_event was created using 'CreateEvent( NULL, TRUE, FALSE, NULL );' */
        WSAEventSelect( socket_name, socket_event, FD_ALL_EVENTS );

        if ( !startStatusThread() )
        {
            rerror = 1;
            P_ERR( "Status thread failed: %d\n", id );
        }
    }
    else
    {
        P_ERR( "listen() error %d : Error %d\n", id, WSAGetLastError() );
        closesocket( socket_name );
    }
}
else
{
    P_ERR( "bind() error ( Id: %d ): %d\n", id, WSAGetLastError() );
    closesocket( socket_name );
}
    /* waits 10ms for events in the event array ( in this case just 1 event as socket_event ). */
    rerror = WSAWaitForMultipleEvents( 1, &socket_event, FALSE, 10, FALSE );
    if ( rerror == WSA_WAIT_TIMEOUT )
    {
        continue; /* this block of code runs in a while loop. */
    }

    index = rerror - WSA_WAIT_EVENT_0; /* get the smallest index of a triggered event */
    if ( rerror != WSA_WAIT_TIMEOUT && rerror != WSA_WAIT_FAILED )
    {
        /* returns a list of the events that occured. */
        rerror = WSAEnumNetworkEvents( socket_name, socket_event, &events );
        if ( rerror == SOCKET_ERROR )
        {
            P_ERR( "WSAEnumNetworkEvents Error %d: Id: %d\n", WSAGetLastError(), pThis->id );
            continue;
        }
        /* look below for this function. */
        handleNetworkEvents( events, index );
    }
void
handleNetworkEvents( WSANETWORKEVENTS e, const int socket_index )
{
    int rerror = 0;
    /* on accept. */
    if ( e.lNetworkEvents & FD_ACCEPT )
    {
        if ( e.iErrorCode[FD_ACCEPT_BIT] == 0 )
        {
            onAccept();
        }
        else
        {
            P_ERR( "Unknown network event error %d\n", id );
        }
    }
    /* on connect */
    if ( e.lNetworkEvents & FD_CONNECT )
    {
        if ( e.iErrorCode[FD_CONNECT_BIT] == 0 )
        {
            sendRead(); /* send first read request */
        }
        else
        {
            P_ERR( "Unknown network event error %d\n", id );
        }
    }
    /* on successful read */
    if ( e.lNetworkEvents & FD_READ )
    {
        sendRead(); /* get read data and queue another request. */
        callback( id, inBuffer.buf, lastReadSize ); /* process data. */
    }
    /* on close. */
    if ( e.lNetworkEvents & FD_CLOSE )
    {
        /* close the current event and make a new one ready for a new connection. */
        onClose( socket_index );
    }
}