Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;程序流:对象和主函数中的套接字_C++_Sockets_Program Flow - Fatal编程技术网

C++ C++;程序流:对象和主函数中的套接字

C++ C++;程序流:对象和主函数中的套接字,c++,sockets,program-flow,C++,Sockets,Program Flow,基本上我拥有的是:一个简单的命令行套接字服务器程序,它监听套接字并一次接受一个连接。当该连接丢失时,它将打开以进行进一步连接 该套接字通信系统包含在一个类中。该类完全能够接收连接并将接收到的数据镜像到客户端。但是,该类使用UNIX套接字,这些套接字不是面向对象的 我的问题是,在main()函数中,我有一行——创建该对象实例的那一行。然后对象初始化并等待。但一旦获得连接,对象的初始化函数就会返回,当这种情况发生时,程序就会退出。在程序退出之前,如何等待该对象被删除 总结: main()创建对象的实

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

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

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

总结:

  • main()创建对象的实例
  • 对象侦听
  • 收到的连接
  • 对象的初始化函数返回
  • main()退出(!)
  • 我想要的是main()在退出之前以某种方式延迟,直到该对象完成它正在做的事情(即它将删除自身)


    有什么想法吗?

    如果你发布了一些代码,回答起来会更容易,但是看起来很简单。。。。围绕main()的内容添加while(1)循环:


    如果你发布了一些代码,那么回答起来就容易多了,但这似乎很简单。。。。围绕main()的内容添加while(1)循环:


    有几种可能的解决方案,但如果没有进一步的信息,就很难决定哪一种在您的情况下是最好的

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


    第二个想法是Jeremy Friesner的while循环想法的变体。你似乎因为效率问题而反对它。我的建议是:先做一些有效的事情,然后再处理效率问题。要节省资源,请在构造函数之后进行sleep()调用。

    有几种可能的解决方案,但如果没有进一步的信息,很难决定哪一种是您的情况下最好的

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

    第二个想法是Jeremy Friesner的while循环想法的变体。你似乎因为效率问题而反对它。我的建议是:先做一些有效的事情,然后再处理效率问题。为了节省资源,在构造函数之后加入一个sleep()调用。

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

    对我来说,这听起来像是物体在开始一条线

    假设是这样,您有两个选择:

  • 调用
    pthread\u join
    等待对象启动的线程完成
  • 让主调用
    pthread\u退出
    。这只会结束线程,而不是整个进程
  • 我想要的是main()在退出之前以某种方式延迟,直到该对象完成它正在做的事情(即它将删除自身)

    对我来说,这听起来像是物体在开始一条线

    假设是这样,您有两个选择:

  • 调用
    pthread\u join
    等待对象启动的线程完成
  • 让主调用
    pthread\u退出
    。这只会结束线程,而不是整个进程

  • 如果对象正在启动线程,那么可能API中存在某种.wait()方法,或者您可以访问内部线程对象并创建一个join()

    如果没有,您也无法更改API,那么您将不得不在里面休息一会儿。。而且可能看起来不太好看


    您的网络类似乎在您不知道或没有能力等待的情况下启动了一个线程。如果网络类做了您需要的一切,那么在它内部使用线程又有什么意义呢,因为您同时只有一个客户端?

    如果对象正在启动一个线程,那么可能API中有某种.wait()方法,或者您可以访问内部线程对象并创建一个join()

    如果没有,您也无法更改API,那么您将不得不在里面休息一会儿。。而且可能看起来不太好看


    您的网络类似乎在您不知道或没有能力等待的情况下启动了一个线程。如果Network类做了您需要的一切,那么在它内部使用线程又有什么意义呢,因为您同时只有一个客户机?

    通常,服务器有一个侦听套接字,您循环接受客户机连接,为每个在单独线程中执行的连接创建一个新的连接处理类。

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

    问题是,这将继续创建多个对象。main()中的行是:
    NetworkLink*NetworkLink=newnetworklink(newunixsocketservercommprotocol())不幸的是,我不能在这里发布任何附加代码;目前这是机密。然而,我可以说comm类工作得很好。只是程序在有机会工作之前就退出了;我们的要求之一是效率(该程序最终将嵌入远程机器人系统),因此电池寿命至关重要。如果它使用了过多的处理器c
    
    int main(int, char **)
    {
       while(1)
       {
          [...]
       }
    }