gpt4 book ai didi

C 非阻塞 UDP 套接字

转载 作者:行者123 更新时间:2023-11-30 16:45:31 25 4
gpt4 key购买 nike

我一直在寻找如何让客户端在不阻塞主循环的情况下接收来自服务器的请求,但没有成功,如果有重复的版本,我深表歉意,但我在网上找到的都是 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 将请求传递给主线程。

关于C 非阻塞 UDP 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44092234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com