C非阻塞UDP套接字

时间:2017-05-21 01:05:07

标签: c sockets udp

我一直在环顾四周如何让客户端接收来自服务器的请求而不会阻止主循环,我很抱歉,如果那里有重复,我很抱歉,但我在网上找到的都是TCP版本,不适用于我的目的(UDP)。

现在服务器只是一个Echo Server,所以如果它阻止,我真的不在乎。

服务器创建如下

ServerInstance Init(ServerConfiguration c) {
  ServerInstance n;
  n.endpoint = socket(PF_INET, SOCK_DGRAM, 0);
  Exitif(n.endpoint < 0, "Error opening endpoint socket");
  setsockopt(n.endpoint, SOL_SOCKET, SO_REUSEADDR, (const void *) &c.trueval, sizeof(int));
  setzero((char *) &n.servaddr, sizeof(n.servaddr));
  n.servaddr.sin_family = AF_INET;
  n.servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  n.servaddr.sin_port = htons(c.portno);
  Exitif(bind(n.endpoint, (struct sockaddr *) &n.servaddr, sizeof(n.servaddr)) < 0,
  "Error on binding socket to addr");
  n.buf = calloc(c.buffersize, sizeof(char))
  return n;
}

至于客户:

  connection = socket(AF_INET, SOCK_DGRAM, 0);
  IfThenExit(socket < 0, "Error initializing UDP socket\n");
  setzero((char *) &servaddr, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons(PORT);
  IfThenExit(inet_aton(SRVADDR, &servaddr.sin_addr) == 0, "IPV4 Address Invalid\n");
  CleanQueueAdd(&connection, Socket);

它如上所述循环,我也有SDL的事件池,我想知道如何在不阻止程序的情况下实现类似的东西

if(1) {
  while(SDL_PollEvent(&e)) {
    switch(e.type) {
      case SDL_QUIT:
        quit = 1;
        break;
      case SDL_KEYDOWN:
        quit = 1;
        break;
    }
  }
  // Recv here blocks ...
  // recv(...)
}

感谢您阅读并度过愉快的一天

1 个答案:

答案 0 :(得分:0)

似乎SDL事件不能与任意非SDL事件复用。相反,您可以创建一个使用select()epoll()的辅助线程或其他包装器。该线程将等待网络消息,读取并解析它们,并使用SDL_PushEvent将请求传递给主线程。