测试一下socket是否在linux中打开

时间:2009-07-21 18:54:22

标签: sockets tcp

我有一个linux服务器程序,它等待来自客户端的传入连接,并根据您发送的命令执行不同的连接。这是伪代码

setup_socket();

while(1)
{
   listen();
   newfile_descriptor = accept();
   int command
   read(newfile_descriptor,&command,sizeof(int));
   switch(command)
   {
      ...
   }
}

但是当我想用同一个客户端发送多个命令时,它会永远监听(因为没有建立新的连接)。有没有办法在听一个新的之前检查是否已经有连接?

6 个答案:

答案 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