作为一个学校项目,我必须重新编码一个IRC服务器,但我坚持一个问题。 我想要做的是接收并执行客户端的命令而不会阻塞(因为我有很多客户端需要服务)。C socket:非阻塞方式读取 n分离的命令
编辑:使用非阻塞套接字和叉()是被禁止的这个项目
关于命令:
- 他们是 “\ r \ n” 分隔
- 他们是512字符最大值
我的第一次尝试是使用getline循环。它的工作完美,但只针对一个客户端(如函数getline块时,他们被提更多的阅读,而不是传递给下一个客户端)
bool recv_cmd(t_hdl *hdl)
{
char *raw;
size_t len;
FILE *input_stream;
ssize_t nread;
len = 0;
raw = NULL;
if ((input_stream = fdopen(dup(hdl->sender->fd), "r")) == NULL)
return (false);
while ((nread = getline(&raw, &len, input_stream)) > 0)
{
printf("%lu\n", nread);
parse_cmd(hdl, raw);
exec_cmd(hdl);
}
fclose(input_stream);
return (true);
}
如果我删除从像这样的循环,则对getline,这对所有的工作客户端,但只执行来自客户端的第一个命令(例如,如果客户端发送“命令1 \ r \ ncommand2 \ r \ n”个,仅执行命令1)
bool recv_cmd(t_hdl *hdl)
{
char *raw;
size_t len;
FILE *input_stream;
len = 0;
raw = NULL;
if ((input_stream = fdopen(dup(hdl->sender->fd), "r")) == NULL)
return (false);
if (getline(&raw, &len, input_stream) != -1)
{
parse_cmd(hdl, raw);
exec_cmd(hdl);
//free(raw
}
fclose(input_stream);
return (true);
}
我还试图删除FCLOSE (),所以当我们读取command1时,command2停留在流缓冲区中,但它也不起作用。
该项目的主题还表示“使用循环缓冲区,以保护和优化正在发送和接收的各种命令和响应”“。
我应该怎么做?在这种情况下使用循环缓冲区比我的getline有什么优势?
如何使用*非阻塞*套接字和使用例如轮询'select'? –
您的客户机/服务器I/O **是否在低级读写操作(即:对您的项目的要求)中具有非阻塞性,或者您是否必须能够处理多个并发客户机以快速,无序的方式从服务器连接? – DevNull
@Someprogrammerdude我已经在使用select但是非阻塞套接字不允许用于这个项目:/ –