我正在编写一个简单的C游戏,接受网络上的关键输入。因为这是我第一次在C中处理套接字,所以我遇到了一些函数问题。这个名为' recv'的函数似乎等待TCP连接中的任何网络消息,直到收到数据。问题在于,因为这会冻结'程序虽然没有消息,我应该在无限循环中运行的正常游戏代码不会正常工作。有没有办法可以等待网络消息并同时运行游戏?
while (1) //Infinite 'game loop' start
{
read_size = recv(newsockfd , client_message , 2000 , 0);
if(read_size > 0)
{
//Do something
}
//Game code here (Doesn't work when there are no incoming messages!)
}
答案 0 :(得分:2)
答案取决于后台处理必须做什么以及它必须运行的频率。如果您的后台处理是一个需要一直运行并且没有自然中断的连续任务,那么您可能需要一个线程。如果它只是有限的必须定期发生,你不需要一个线程,你需要poll或select。
poll
更灵活,但select
有更简单的API,但它们或多或少做同样的事情。您提供了一组文件描述符,您感兴趣的事件和超时。
如果您在案例中使用select
,则将套接字置于读取文件描述符集中并提供合适的时间。当select
返回时,您的套接字将有一些数据或超时将过期。
使用select
而非阻塞IO的优点是,您可以轻松处理多个套接字,而不是在没有任何事情发生时紧密循环,您的进程将被暂停。
答案 1 :(得分:-1)
使用多线程解决此问题。 recv
函数阻塞,因此您无法使用单线程进行此操作。
或使用非阻塞套接字(无超时)。