4
回答
NETTY如何使得特定的连接 keepalive
【寻找人气王】邀新用户免费体验华为云服务,百元话费等你拿!   

如下:

@Override
    public void messageReceived(
            ChannelHandlerContext ctx, MessageEvent e) {
    	
    	Protocal recv = (Protocal)e.getMessage();
    	
        if (recv.type == 0) {
        	TODO://当接收到type ==0 的连接时,我想使这个特定
//的连接keepalive.自己整了好久没搞定,求助大家。
        	
        }
    }
举报
红红
发帖于6年前 4回/3K+阅
共有4个答案 最后回答: 6年前

问题已经搞定了,其实服务端NETTY的编码是没有什么问题的,问题出在客户端:

下面是有问题的代码

static UINT WINAPI keepAlive(LPVOID pParam)
{
	SOCKET *fd = reinterpret_cast<SOCKET*>(pParam);
	while(1)
	{
		if (recv(*fd, (char *)&head, 16, 0) == -1)
		{
			OutputDebugString("recv error\n");
			break;
		}

                //TODO:逻辑处理

                //问题出在这里,*fd的值改变了,直接报error 10038,现在也搞
                //不懂是为什么。
		if (send(*fd, (char *)&head, 16, 0) == -1)
		{
			OutputDebugString("send error\n");
			break;
		}
	}

	DWORD err = WSAGetLastError();
	closesocket(*fd);
	::PostMessage(AfxMainHWnd, MSG_CONNECTION_NOTIFY, FALSE, 0);
	return 0;
}

下面是修改过后 的代码:

static UINT WINAPI keepAlive(LPVOID pParam)
{
	SOCKET *fd = reinterpret_cast<SOCKET*>(pParam);
	const int const_fd = *fd;
	//用const 常量存放 fd,这样fd 的值就不会被改变了
	while(1)
	{
		if (recv(const_fd, (char *)&head, 16, 0) == -1)
		{
			OutputDebugString("recv error\n");
			break;
		}

                //TODO:逻辑处理
。
		if (send(const_fd, (char *)&head, 16, 0) == -1)
		{
			OutputDebugString("send error\n");
			break;
		}
	}

	DWORD err = WSAGetLastError();
	closesocket(const_fd);
	::PostMessage(AfxMainHWnd, MSG_CONNECTION_NOTIFY, FALSE, 0);
	return 0;
}
现在问题是解决了,但是我还是不知道为什么recv会改变fd 的值的,导致他报10038的错误

顶部