簡體   English   中英

C非阻塞UDP套接字

[英]C Non-Blocking UDP Socket

我一直在尋找如何使客戶端在不阻止主循環的情況下接收來自服務器的請求的方法,無濟於事,我很抱歉如果那里有重復的內容,但是我一直在網上找到的都是TCP版本,無法正常工作就我而言(UDP)。

現在,該服務器只是一個Echo服務器,因此我並不在乎它是否阻塞。

服務器創建如下

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(...)
}

謝謝您的閱讀,祝您有美好的一天

似乎SDL事件無法與任意非SDL事件復用。 相反,您可以創建一個使用select()epoll()或圍繞它們的包裝器的輔助線程。 該線程將等待網絡消息,讀取並解析它們,然后使用SDL_PushEvent將請求傳遞給主線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM