【发布时间】:2013-11-18 12:15:46
【问题描述】:
我正在编写一种聊天服务器应用程序,其中从一个 websocket 客户端接收到的消息被发送到所有其他 websocket 客户端。为此,我将连接的客户端保存在一个列表中。当客户端断开连接时,我需要将其从列表中删除(这样以后的“发送”就不会失败)。
但是,有时当客户端断开连接时,服务器只会收到一个异常“对等方重置连接”,并且代码没有机会从客户端列表中删除。有没有办法保证连接已重置的“好”通知?
我的代码是:
void WsRequestHandler::handleRequest(HTTPServerRequest &req, HTTPServerResponse &resp)
{
int n;
Poco::Timespan timeOut(5,0);
try
{
req.set("Connection","Upgrade"); // knock out any extra tokens firefox may send such as "keep-alive"
ws = new WebSocket(req, resp);
ws->setKeepAlive(false);
connectedSockets->push_back(this);
do
{
flags = 0;
if (!ws->poll(timeOut,Poco::Net::Socket::SELECT_READ || Poco::Net::Socket::SELECT_ERROR))
{
// cout << ".";
}
else
{
n = ws->receiveFrame(buffer, sizeof(buffer), flags);
if (n > 0)
{
if ((flags & WebSocket::FRAME_OP_BITMASK) == WebSocket::FRAME_OP_BINARY)
{
// process and send out to all other clients
DoReceived(ws, buffer, n);
}
}
}
}
while ((flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE);
// client has closed, so remove from list
for (vector<WsRequestHandler *>::iterator it = connectedSockets->begin() ; it != connectedSockets->end(); ++it)
{
if (*it == this)
{
connectedSockets->erase(it);
logger->information("Connection closed %s", ws->peerAddress().toString());
break;
}
}
delete(ws);
ws = NULL;
}
catch (WebSocketException& exc)
{
//never gets called
}
}
【问题讨论】:
-
您找到解决问题的方法了吗?当客户端断开连接时,我还会收到“对等连接重置”。