【发布时间】:2016-04-02 16:54:42
【问题描述】:
我正在使用我创建的 Socket 类在我的程序中创建一个套接字连接。该程序在无限循环中运行并退出它我使用 ctrl-c。现在当我关闭程序时,我的析构函数没有被调用(内存在我读过here 时被释放,但在中断程序时套接字没有被释放)。有没有办法调用析构函数退出这样的程序?
socket类定义:
class Socket
{
private:
int m_sock;
sockaddr_in m_addr;
public:
Socket();
virtual ~Socket();
// Server initialization
bool create();
bool bind ( const int port );
bool listen() const;
bool accept ( Socket& ) const;
// Client initialization
bool connect ( const std::string host, const int port );
// Data Transimission
bool send ( const std::string ) const;
int recv ( std::string& ) const;
void set_non_blocking ( const bool );
bool is_valid() const { return m_sock != -1; }
};
析构函数定义:
Socket::~Socket(){
close(m_sock);
}
主要功能:
try {
// Create the socket
ServerSocket server ( 15000 );
std::cout << "Server running on 0.0.0.0:15000" << std::endl;
std::string res;
while(true) {
ServerSocket new_sock;
server.accept ( new_sock );
try {
while(true) {
std::string data;
new_sock >> data;
res = process_query(data, kv_map, zset_map);
new_sock << res;
}
}
catch(SocketException&) {}
}
}
catch ( SocketException& e ){
std::cout << "Exception was caught:" << e.description() << "\nExiting.\n";
}
return 0;
【问题讨论】:
-
看代码可能会很方便
-
这类问题的标准答案是使用 boost::asio 进行套接字和信号 (ctrl-c) 检测。它会为您处理所有的并发症。
-
@RichardHodges 我没有使用任何外部库。我正在使用我编写的 C++ 来实现它。
-
@EdHeal 我已经添加了代码
-
@ayushgp:在没有外部库的情况下,在 C++ 中编写使用套接字的代码是不可能的,因此您的陈述必须是错误的。 (假设您正在使用 libc 提供并由 POSIX 描述的工具。)
标签: c++