简单的Poco TCP网络应用核心转储
Simple Poco TCP networking application core dumping
我目前正在研究 Poco
并尝试构建一个简单的 TCP
服务器-客户端应用程序。
本例中 Client
的唯一任务是将所有接收到的数据回显给发送方。
如果我执行已编译的应用程序,退出时会收到以下消息:
*** Error in `./gameserver': free(): invalid pointer: 0x00007ffd4896cbf8 ***
Aborted (core dumped)
我不太明白这里的问题。我认为这与代码的 Poco
部分有关,我在使用 Poco
时遗漏了一些重要的东西。
如果有人能告诉我我的代码有什么问题,那就太好了。
代码:
class Client : public TCPServerConnection
{
public:
explicit Client(const StreamSocket &socket)
: TCPServerConnection(socket)
{
}
~Client()
{
socket().close();
}
void run()
{
char buffer[256];
int n = socket().receiveBytes(buffer, 256);
while(n > 0)
{
socket().sendBytes(buffer, n);
n = socket().receiveBytes(buffer, 256);
}
}
};
class Factory : public TCPServerConnectionFactory
{
public:
TCPServerConnection* createConnection(const StreamSocket &socket)
{
return new Client(socket);
}
};
class Server
{
public:
explicit Server(const string &endpoint)
: address(endpoint), socket(address), factory(), server(&factory, socket)
{
server.start();
}
~Server()
{
server.stop();
}
private:
SocketAddress address;
ServerSocket socket;
TCPServer server;
Factory factory;
};
int main()
{
{
Server server("localhost:5556");
cin.get();
}
}
问题是Factory
的双免。 Server
和 TCPServer
对象都拥有 Factory
,因此它们都在使用完后释放它。
解决方法是选择一个,让它拥有工厂,而且只有它拥有工厂。这是一种方法:
class Server
{
public:
explicit Server(const string &endpoint)
: address(endpoint), socket(address), server(new Factory(), socket)
{
server.start();
}
~Server()
{
server.stop();
}
private:
SocketAddress address;
ServerSocket socket;
TCPServer server;
};
我目前正在研究 Poco
并尝试构建一个简单的 TCP
服务器-客户端应用程序。
本例中 Client
的唯一任务是将所有接收到的数据回显给发送方。
如果我执行已编译的应用程序,退出时会收到以下消息:
*** Error in `./gameserver': free(): invalid pointer: 0x00007ffd4896cbf8 ***
Aborted (core dumped)
我不太明白这里的问题。我认为这与代码的 Poco
部分有关,我在使用 Poco
时遗漏了一些重要的东西。
如果有人能告诉我我的代码有什么问题,那就太好了。
代码:
class Client : public TCPServerConnection
{
public:
explicit Client(const StreamSocket &socket)
: TCPServerConnection(socket)
{
}
~Client()
{
socket().close();
}
void run()
{
char buffer[256];
int n = socket().receiveBytes(buffer, 256);
while(n > 0)
{
socket().sendBytes(buffer, n);
n = socket().receiveBytes(buffer, 256);
}
}
};
class Factory : public TCPServerConnectionFactory
{
public:
TCPServerConnection* createConnection(const StreamSocket &socket)
{
return new Client(socket);
}
};
class Server
{
public:
explicit Server(const string &endpoint)
: address(endpoint), socket(address), factory(), server(&factory, socket)
{
server.start();
}
~Server()
{
server.stop();
}
private:
SocketAddress address;
ServerSocket socket;
TCPServer server;
Factory factory;
};
int main()
{
{
Server server("localhost:5556");
cin.get();
}
}
问题是Factory
的双免。 Server
和 TCPServer
对象都拥有 Factory
,因此它们都在使用完后释放它。
解决方法是选择一个,让它拥有工厂,而且只有它拥有工厂。这是一种方法:
class Server
{
public:
explicit Server(const string &endpoint)
: address(endpoint), socket(address), server(new Factory(), socket)
{
server.start();
}
~Server()
{
server.stop();
}
private:
SocketAddress address;
ServerSocket socket;
TCPServer server;
};