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 ); }