Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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

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
Multithreading socket()返回std::thread内的文件描述符1_Multithreading_Sockets_C++11 - Fatal编程技术网

Multithreading socket()返回std::thread内的文件描述符1

Multithreading socket()返回std::thread内的文件描述符1,multithreading,sockets,c++11,Multithreading,Sockets,C++11,当我在std::thread()中调用socket()时,它返回一个套接字描述符1。调用std::cout,然后将用于终端的文本发送到服务器。当我添加cout时,如果您意外地关闭了stdout,通常会发生这种情况,即存在虚假的关闭(1)。那么FD将合法地成为1号。这很可能在计划的其他地方 我已经这样做过好几次了,通常在gdb中找到它,并在close()上设置断点 您的析构函数看起来可疑: Client::~Client() { close( fd ); } 您是否应该在构造函数中将fd设置为-

当我在
std::thread()
中调用
socket()
时,它返回一个套接字描述符1。调用
std::cout
,然后将用于终端的文本发送到服务器。当我添加
cout时,如果您意外地关闭了
stdout
,通常会发生这种情况,即存在虚假的
关闭(1)。那么FD将合法地成为1号。这很可能在计划的其他地方

我已经这样做过好几次了,通常在
gdb
中找到它,并在
close()
上设置断点

您的析构函数看起来可疑:

Client::~Client() { close( fd ); }

您是否应该在构造函数中将
fd
设置为
-1
,并小心地将
fd
设置为
-1
关闭它,如果
fd==-1
则不关闭它?当前正在创建一个
客户端
并销毁它将关闭一个随机fd。

请同时显示.hpp文件。这是一个标准违规行为。您的类持有在析构函数中销毁的资源(
fd
),您应该实现或禁止复制/移动构造/分配。此外,对
freeaddrinfo
的调用在错误条件中的
返回之后,导致连接失败时内存泄漏。所有代码都在问题中发布。我正在使用
g++-std=gnu++11-pthread-ggdb-Wall-cclient.cpp进行编译;g++-std=gnu++11-pthread-ggdb-Wall-oclient.o
并使用客户机localhost 9850启动程序。我并没有使用gdb来启动程序,但我确实在编译程序时启用了调试信息。将fd初始化为-1似乎已经做到了这一点。我还向析构函数添加了
if(fd!=-1){close(fd);}
,以防止关闭随机描述符。我将添加
fd=-1我调用
close()
以消除在对象被破坏时关闭随机描述符的任何地方。值得一提的是,伪关闭不是“代码中的其他地方”当客户机对象被复制到新对象以供新线程使用后超出范围时,它位于
main
for
循环的末尾。
#ifndef __CLIENT_HPP__
#define __CLIENT_HPP__

#include <string>

class Client {
    private:
        int fd;
        std::string hostname;
        std::string port;
        std::string _recv( ) const;
        void _send( const std::string buf ) const;

    public:
        Client( const std::string& hostname, const std::string& port);
        ~Client();
        void operator()();
};

#endif
Client::~Client() { close( fd ); }