NETTY如何使得特定的连接 keepalive

红红 发布于 2012/11/20 17:58
阅读 3K+
收藏 0

如下:

@Override
    public void messageReceived(
            ChannelHandlerContext ctx, MessageEvent e) {
    	
    	Protocal recv = (Protocal)e.getMessage();
    	
        if (recv.type == 0) {
        	TODO://当接收到type ==0 的连接时,我想使这个特定
//的连接keepalive.自己整了好久没搞定,求助大家。
        	
        }
    }
加载中
0
红红
红红
还是搞不定,蛋疼
0
雪之舞
窃以为,你不关,它就是keepalive了。
红红
红红
但是我客户recv时却是SOCKET_ERROR
0
石头哥哥
石头哥哥
http://my.oschina.net/chenleijava/blog/87231基于netty的服务端  测试成功的好好研究下
红红
红红
谢谢,找时间看下
0
红红
红红

问题已经搞定了,其实服务端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的错误

返回顶部
顶部