gpt4 book ai didi

c++ - 奇怪的 poco react 器的通知

转载 作者:行者123 更新时间:2023-11-28 02:51:23 27 4
gpt4 key购买 nike

我有实现 Poco SocketReactor 的代码,如 Echo 示例中所述。

class TSPConnectionHandler
{
public:
TSPConnectionHandler(const StreamSocket& socket, SocketReactor& reactor) : _socket(socket),
_reactor(reactor)
{
_reactor.addEventHandler(_socket, Poco::NObserver<TSPConnectionHandler, ReadableNotification>(*this, &TSPConnectionHandler::onSocketReadable));
_reactor.addEventHandler(_socket, Poco::NObserver<TSPConnectionHandler, WritableNotification>(*this, &TSPConnectionHandler::onSocketWritable));
_reactor.addEventHandler(_socket, Poco::NObserver<TSPConnectionHandler, ShutdownNotification>(*this, &TSPConnectionHandler::onSocketShutdown));
_reactor.addEventHandler(_socket, Poco::NObserver<TSPConnectionHandler, ErrorNotification>(*this, &TSPConnectionHandler::onSocketError));
_reactor.addEventHandler(_socket, Poco::NObserver<TSPConnectionHandler, TimeoutNotification>(*this, &TSPConnectionHandler::onSocketTimeout));
}
virtual ~TSPConnectionHandler()
{
_reactor.removeEventHandler(_socket, Poco::NObserver<TSPConnectionHandler, ReadableNotification>(*this, &TSPConnectionHandler::onSocketReadable));
_reactor.removeEventHandler(_socket, Poco::NObserver<TSPConnectionHandler, WritableNotification>(*this, &TSPConnectionHandler::onSocketWritable));
_reactor.removeEventHandler(_socket, Poco::NObserver<TSPConnectionHandler, ShutdownNotification>(*this, &TSPConnectionHandler::onSocketShutdown));
_reactor.removeEventHandler(_socket, Poco::NObserver<TSPConnectionHandler, ErrorNotification>(*this, &TSPConnectionHandler::onSocketError));
_reactor.removeEventHandler(_socket, Poco::NObserver<TSPConnectionHandler, TimeoutNotification>(*this, &TSPConnectionHandler::onSocketTimeout));
}

void onSocketReadable(const Poco::AutoPtr<ReadableNotification>& pNf)
{
cout << "READable !!" << endl;
try
{
vector<char> m_buffer;
m_buffer.resize(1024, '\0');
LONG32 m_buflen = _socket.receiveBytes(&m_buffer[0], 1024);
if (m_buflen == 0)
{
cout << "Connection reset by peer normally" << endl;
delete this;
}
_socket.sendBytes(&m_buffer[0], m_buflen);
}
catch(Poco::Net::NetException& e)
{
cout << "socket read exception: " << e.displayText() << endl;
delete this;
}
}
void onSocketWritable(const Poco::AutoPtr<WritableNotification>& pNf)
{
cout << "WRITEable !!" << endl;
}
void onSocketShutdown(const Poco::AutoPtr<ShutdownNotification>& pNf)
{
cout << "SHUTDOWN!!!!!!!!!!!!" << endl;
delete(this);
}
void onSocketError(const Poco::AutoPtr<ErrorNotification>& pNf)
{
cout << "Error!!" << endl;
}
void onSocketTimeout(const Poco::AutoPtr<TimeoutNotification>& pNf)
{
cout << "Timeout!!" << endl;
}

private:
StreamSocket _socket;
SocketReactor& _reactor;
};

它通常使用以下代码在程序的其他地方启动:

Poco::Net::ServerSocket tcpsock("9495");
Poco::Net::SocketReactor reactor;
Poco::Net::SocketAcceptor<TSPConnectionHandler> acceptor(tcpsock, reactor);
Poco::Thread thread;
thread.start(reactor);

waitForTerminationRequest();

reactor.stop();
thread.join();
return Application::EXIT_OK;

我也有 python 客户端来测试它:

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 9495))
data = raw_input ( "Something:" )
client_socket.send(data)
data = client_socket.recv(1024)
print "RECIEVED:" , data
client_socket.close()

我得到了我不明白如何解决的问题列表:

  • 在 python string "client_socket.connect(('localhost', 9495))"完成后,服务器开始发送垃圾邮件 "onSocketWritable",如何阻止它?我知道如果套接字变得可写,我必须得到通知,但为什么它在整个套接字的生命周期中继续这样做?如果那是正常情况,那么设计 WritableNotification 的目的是什么?
  • 如果我将在 Debug模式下启动 python 并在“client_socket.close()”之前关闭它,服务器会出现异常并将被删除并抛出“套接字读取异常:”。但是 errornotification 和 shutdownnotification 不会被调度。为什么?我从来没有看到他们被 dispatch 过。
  • 如果我让“client_socket.close()”完成,在服务器端我将收到 ReadableNotification 并抛出“Connection reset by peer normally”。但是仍然不会有 ShutdownNotification。为什么?

最佳答案

  1. 一旦您连接到服务器,就会实例化一个套接字,如果您注册了一个可写通知,您将收到有关此状态的通知。这意味着只有在必须发送数据时才添加此事件处理程序。套接字将发送数据,完成后,将再次调用此处理程序(异步套接字...)。如果您不必为此事件发送更多 block 的调用 removeEventHandler。

  2. 套接字 react 器使用 select 命令 (Socket::select(readable, writable, except, _timeout)) errornotification 这个名字有点误导(会得到一些错误条件,但也会得到越界数据)。如果套接字正常关闭,将在没有可用字符的情况下调用 onReadable,否则将抛出 Poco::Net::ConnectionResetException。

  3. ShutdownNotification 在 SocketReactor 停止时发送。

你应该看看 SocketRactor.cpp 然后一切都清楚得多。

关于c++ - 奇怪的 poco react 器的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22957250/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com