我有一个linux服务器程序,它等待来自客户端的传入连接,并根据您发送的命令执行不同的连接。这是伪代码
setup_socket();
while(1)
{
listen();
newfile_descriptor = accept();
int command
read(newfile_descriptor,&command,sizeof(int));
switch(command)
{
...
}
}
但是当我想用同一个客户端发送多个命令时,它会永远监听(因为没有建立新的连接)。有没有办法在听一个新的之前检查是否已经有连接?
答案 0 :(得分:2)
读取命令的循环怎么样:
setup_socket();
while(1)
{
listen();
newfile_descriptor = accept();
int command
command = read(newfile_descriptor,&command,sizeof(int));
while(command) {
switch(command)
{
...
}
// get next command, or figure out closed connection
command = read(newfile_descriptor,&command,sizeof(int));
}
}
答案 1 :(得分:2)
您可以使用select
/ poll
对套接字IO进行多路分解,或者让一个单独的线程读取客户端套接字上的命令。
答案 2 :(得分:1)
如何检查是否可以从套接字中读取更多内容?如果没有其他内容,我认为你应该在命令结束时关闭你的连接。
答案 3 :(得分:1)
您需要的是一些基本协议,它允许客户端通知您已完成发送命令。它可以像客户端继续发送命令一样简单,然后在不再需要发送时关闭套接字。在这种情况下,您只需继续从套接字读取,直到它关闭。在您的伪代码中,它看起来像这样:
setup_socket();
while(1) {
listen();
newfile_descriptor = accept();
int command;
do {
command = read(newfile_descriptor,&command,sizeof(int));
if (command > 0) {
switch(command) {
...
}
}
} while (command > 0);
}
答案 4 :(得分:1)
要详细说明尼古拉的回应,请查看必不可少的Beej's guides。 在while(1)循环中调用accept()之后立即生成一个新线程是一种非常标准的做法。此线程处理与客户端的所有通信,以便主线程可以继续侦听()获取新的传入连接并在它们到达时接受()。
Here是select()的特定部分,我知道,但以前没有使用过。
答案 5 :(得分:1)
第一件事...... 是在while循环之外移动你的listen()。 :P