2

关于使用套接字的 C++ 程序流,我有一个相当棘手的问题。

基本上我所拥有的是:一个简单的命令行套接字服务器程序,它在套接字上侦听并一次接受一个连接。当该连接丢失时,它将打开以进行进一步的连接。

该套接字通信系统包含在一个类中。该类完全能够接收连接并将接收到的数据镜像到客户端。但是,该类使用非面向对象的 UNIX 套接字。

我的问题是在我的 main() 函数中,我有一行 - 创建该对象实例的那一行。然后对象初始化并等待。但是一旦获得连接,对象的初始化函数就会返回,当这种情况发生时,程序就会退出。在程序退出之前,我如何以某种方式等到该对象被删除?

概括:

  1. main() 创建对象的实例
  2. 对象监听
  3. 收到连接
  4. 对象的初始化函数返回
  5. main() 退出 (!)

我想要的是 main() 在退出之前以某种方式延迟,直到该对象完成它正在做的事情(也就是它会删除自己)。

有什么想法吗?

4

5 回答 5

0

如果您发布一些代码会更容易自信地回答,但它似乎很简单......在 main() 的内容周围添加一个 while(1) 循环:

int main(int, char **)
{
   while(1)
   {
      [...]
   }
}
于 2010-06-09T04:34:55.063 回答
0

有几种可能的解决方案,但如果没有更多信息,很难确定哪一个最适合您的情况。

我的第一个想法是将通信部分放在不同的线程中。这使得编程稍微复杂一些,但是当连接关闭时,只有线程终止。

第二个想法是 Jeremy Friesner 的想法与 while 循环的变体。您似乎因为效率而反对它。我的建议:先建立一些有效的东西,然后再处理效率。为了节省资源,请在构造函数之后调用 sleep()。

于 2010-06-09T05:10:59.923 回答
0

我想要的是 main() 在退出之前以某种方式延迟,直到该对象完成它正在做的事情(也就是它会删除自己)。

在我看来,这听起来像是对象正在启动一个线程。

假设是这种情况,您有几个选择:

  1. 调用pthread_join以等待对象启动的线程完成。
  2. 有主叫pthread_exit。这只会结束线程而不是整个过程。
于 2010-06-09T05:31:37.533 回答
0

如果对象正在启动一个线程,也许 API 中有某种 .wait() 方法,或者您可以访问内部线程对象并进行 join()?

如果没有并且您无法更改 API,那么您将不得不有一段时间(1)并在里面睡觉......并且可能看起来不太好。

似乎您的 Network 类在您不知道或没有能力等待它的情况下启动了一个线程。如果 Network 类确实完成了您需要的一切,那么在其中使用线程有什么意义,因为您同时只有一个客户端?

于 2010-06-09T07:57:24.537 回答
0

典型地,服务器有一个监听套接字,你循环接受客户端连接,为每个在单独线程中执行的连接创建一个新的连接处理类。

于 2010-06-09T08:14:37.803 回答