c - 通过使套接字事件驱动使udp套接字成为非阻塞的

标签 c windows sockets networking udp

我正在尝试使我的套接字“基于事件”。以下是我尝试过的:

VOID createServerSocket()
{
   WSADATA wsa; 

   //Initialise winsock//
   if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
      {

        //"WinSock Initialization FAILED",

      }

   //Create a socket//

  SOCKET newSocketIdentifier;
  SOCKADDR_IN newSocket;

  if((newSocketIdentifier = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
      {                 

        //Socket Creation Failed

      }
   //Socket Created//

   //Prepare the sockaddr_in structure//
  newSocket.sin_family = AF_INET;
  newSocket.sin_addr.s_addr = INADDR_ANY;
  newSocket.sin_port = htons(8888);

   //Bind//
   if( bind(newSocketIdentifier ,(struct sockaddr *)&newSocket, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
      { 
       //Bind Failed
      }

   //Bind Done//

   WSAEVENT NewEvent = WSACreateEvent();
   WSAEventSelect(newSocketIdentifier, NewEvent, FD_READ | FD_WRITE); //made the socket "newSocketIdentifier" event based for events "FD_READ" and FD_WRITE

}

我不知道如何进行下一步。我应该如何检查是否发生了任何期望的事件?我如何才能持续不断地检查这些事件?那会在 while(1) 循环下吗?

我在互联网上找到的所有示例都是针对多个套接字的。但是,就我而言,我只有一个套接字,我想让它成为“事件驱动”以进行读写。请帮我。我卡住了!

最佳答案

假设您想要监听传入的 UDP 数据包,请尝试使用以下代码片段并查看。

/ Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
    printf("Error at WSAStartup()\n");

// Create a socket.
SOCKET m_socket[1];
m_socket[0] = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );

if ( m_socket[0] == INVALID_SOCKET ) {
    printf( "Error at socket(): %ld\n", WSAGetLastError() );
    WSACleanup();
    return;
}

// Bind the socket.
sockaddr_in service[1];

service[0].sin_family = AF_INET;
service[0].sin_addr.s_addr = INADDR_ANY;
service[0].sin_port = htons( 8888 );

if ( bind( m_socket[0], (SOCKADDR*) &service[0], sizeof(service[0]) ) == SOCKET_ERROR ) {
    printf( "bind() failed.\n" );
    closesocket(m_socket[0]);
    return;
}

char data[256];
int bytes, waitRet;

WSAEVENT hEvent = WSACreateEvent();
WSANETWORKEVENTS events;
WSAEventSelect(*m_socket, hEvent, FD_READ | FD_WRITE);
while(1)
{
    waitRet = WSAWaitForMultipleEvents(2, &hEvent, FALSE, WSA_INFINITE, FALSE);
    if(WSAEnumNetworkEvents(*m_socket,hEvent,&events) == SOCKET_ERROR)
    {
        cout << "Error";
    }
    else
    {
        if(events.lNetworkEvents & FD_READ)
        {
            bytes = recv(*m_socket, data, 256, 0);
            cout << data << endl;
        }
    }
}

WSACloseEvent(hEvent);

关于c - 通过使套接字事件驱动使udp套接字成为非阻塞的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16412436/

相关文章:

c - 使用 gethostbyname 函数

windows - 为 Java 代码创建 MSI

windows - npm 的漫游应用程序数据,路径太长

c# - 不活动后的 SslStream 延迟

c - 使用函数中的数组填充数组

c - C 中的并行线程

c++ - 无法使 getnameinfo 处理我的 UDP 代码

c - 使用 C 套接字将文件从服务器传输到客户端的问题

c - 如何使用格式说明符检索当前目录之外的文件?

python windows 鼠标钩子(Hook)崩溃