用C语言编写的简单服务器

5
作为我们的任务之一,我们必须使用C语言实现一个非常简单的服务器和一些客户端。我们的想法是使用System V IPC队列创建一个队列,让客户端进行注册,并为每个客户端创建一个消息队列。我对服务器部分有些疑问。我是否应该这样做:
while(1)
{
  //some queue using code
  sleep(100);
}

因此,对于每个时间间隔,我检查每个队列并执行必要的操作,或者我应该使用信号通知服务器至少有一个队列已准备好进行管理。

在普通服务器中,如何完成这项工作?它们是否具有一定时间间隔,在此之后检查它们需要做的所有事情,还是有更适当的方法来处理这个问题?


8
在C语言中,典型的网络编程代码通常使用类似于select()这样的基于事件的方法。以下是一份相当不错的指南(至少在我使用时如此):http://beej.us/guide/bgnet/ - wkl
select()函数能够使用System V队列的ID吗? - Andna
1
我不确定(我大概7年没碰过System V的东西了),但是我上面链接的指南的一部分也讨论了System V队列的使用:http://beej.us/guide/bgipc/output/html/multipage/mq.html 虽然我认为在你的情况下,你需要让客户端连接并选择他们的套接字/描述符,并为他们管理一个队列(而不是在队列上进行select())。 - wkl
3
select(), poll()е’Ңepoll()еҸӘеңЁLinuxдёҠйҖӮз”ЁдәҺйҳҹеҲ—ж“ҚдҪңпјҢдёҚе…·еӨҮеҸҜ移жӨҚжҖ§еҲ°е…¶д»–UNIXзі»з»ҹгҖӮиҜ·еҸӮйҳ…mq_overviewжүӢеҶҢйЎөгҖӮ - dwalter
1个回答

3
您需要做的是类似于这样的事情:
这是一个非常基本的答案,需要放置定义和原型,但是这应该给您一个基本的选择示例。
此代码适用于freebsd、ubuntu和我的windows计算机(如果您有正确的头文件)。另外,它已经被压缩,并且删除了一些定义,例如套接字描述符定义,因为它们基本上就是 - 它就是这样。
struct timeval timeout;
int rc
fd_set wfdset,rfdset,errfdset;
//Do some checks put them in either read fdset or write fdset or error fdset 
FD_SET (socket_sd, &rfdset);
timeout.tv_sec = 0;
timeout.tv_usec = 250 * 1000;
rc = select (maxfds + 1, &rfdset, &wfdset, NULL, &timeout);
//loop through the sockets and read from them at this point.

Select可以在Win32和UNIX上使用,但如果您在unix(例如FreeBSD)上对套接字进行任何重型操作,则不建议选择它。如果需要更深入地管理套接字,请使用kqueue或epoll等类似工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接