首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WINSOCK2 WSAAsyncSelect被否决的问题

WINSOCK2 WSAAsyncSelect被否决的问题
EN

Stack Overflow用户
提问于 2016-06-04 05:48:57
回答 1查看 3.3K关注 0票数 0

嗨,我正在使用winsock2,我正在尝试实现异步通信。我尝试了TCP服务器msdn,它正在等待接受。

我在听函数之前尝试过使用WSAAsyncSelect

代码语言:javascript
运行
复制
WSAAsyncSelect(ListenSocket,
        m_hWnd,
        WM_SOCKET,
        (FD_CLOSE | FD_ACCEPT | FD_READ));

并显示以下错误。

代码语言:javascript
运行
复制
Error   C4996   'WSAAsyncSelect': Use WSAEventSelect() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings 

我该怎么解决这个..。提前谢谢..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-04 06:05:14

要消除该警告,您可以在源文件的顶部定义#define _WINSOCK_DEPRECATED_NO_WARNINGS,这将禁用警告的类型。

尽管如此,听这个警告并使用WSAEventSelect可能是值得的。因为WSAEventSelect向事件发出信号,而不是将消息发送到窗口的消息队列,这正是WSAAsyncSelect所做的。投递到消息队列的速度更慢,并增加了不真正需要的额外处理。

我有一个例子,我将在这里为你张贴:

..。我可能是过火了..。但这一切都是有用的和相关的。

安装监听套接字

代码语言:javascript
运行
复制
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 );
}

从套接字处理事件

代码语言:javascript
运行
复制
    /* 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 );
    }

处理事件。

代码语言:javascript
运行
复制
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 );
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37626833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档