服务器 正常, 测试后确认服务器信息已经发回客户端。客户端也已经链接上服务器端,而且可以发出信息。问题是,客户端发送信息给服务器端,服务器端回复信息后,客户端没有任何响应。void CclientDlg::ConnToServer(SOCKET s)
{
WSAAsyncSelect(s,m_hWnd,NET_READER,FD_READ);
WSAAsyncSelect(s,m_hWnd,NET_END,FD_CLOSE);
/* 绑定接收信息 */
core->SetConnection(true); /* 标记已经链接到服务器端 */
}
这段代码是 WSAAsyncSelect 绑定的。当客户端成功链接服务器端后,所执行。   这里面的套接字和句柄都是正确的 (已经测试)。 struct sockaddr_in local; memset(&local, 0, sizeof(local));
local.sin_addr.S_un.S_addr = inet_addr(ip);
local.sin_family = AF_INET;
local.sin_port = htons(port);//监听端口
if(connect(sListen,(sockaddr*)&local,sizeof(local) )!=0)
{
closesocket(sListen);
WSACleanup();
core->bError("无法链接到服务器。");
} core->SetSocket(sListen); /* 为核心设置客户端套接字 */ ::PostMessageW(core->GethWnd(),CLIENT_CONNECTION,0,sListen);
core->GetCe()->SetStage("链接服务器成功,输入账号密码可以登录......");
这段是链接服务器的代码。和服务器一样都是使用AF_INET, SOCK_STREAM模型。奇怪就奇怪于,为什么,WSAAsyncSelect为什么绑定后,服务器端发送信息来,客户端没有任何信息响应。我甚至已经吧客户端当前所拦截的信息全部打印出来,依然也是没有起色

解决方案 »

  1.   

    rc = WSAAsyncSelect(s, hWnd, wMsg, FD_READ|FD_WRITE);It is not possible to specify different messages for different events. The following code will not work; the second call will cancel the effects of the first, and only FD_WRITE events will be reported with message wMsg2:
    rc = WSAAsyncSelect(s, hWnd, wMsg1, FD_READ);
    rc = WSAAsyncSelect(s, hWnd, wMsg2, FD_WRITE);
    就是说WSAAsyncSelect(s,m_hWnd,NET_END,FD_CLOSE);把    WSAAsyncSelect(s,m_hWnd,NET_READER,FD_READ);给覆盖掉了。
      

  2.   

    噢~~谢谢楼上的。 果然是那样。 不过这次出现了 error 10053 .我再去想想办法,。哎,不是第一次做这个了,怎么疏忽了那点。