最好是从CAsyncSocket派生你自己的Socket类,这样就可以用重载OnAccept、OnConnect、OnReceive、OnClose之类虚函数来得到消息了。
最好将AfxSocketInit放到InitInstance里去,调用一次即可。
还有,在服务器端,Create后就已经给你绑定到端口号了,所以就不必再用Bind了。
还有,在Create中没有必要改变lEvent的值,默认就行。
还有,Bind后边不要加IP地址。最好不用Bind函数。用Create一次完成。
在Connect的时候,如果超时(或其它原因)就会出现上面的情况,(//error……)如果你用了从CAsyncSocket派生的方法,就会得到OnConnect消息,可以在里边利用它的参数nErrorCode(具体值请参阅MSDN)来判断连接是否成功不成功的话,可以在此再次调用Connect。
最好将AfxSocketInit放到InitInstance里去,调用一次即可。
还有,在服务器端,Create后就已经给你绑定到端口号了,所以就不必再用Bind了。
还有,在Create中没有必要改变lEvent的值,默认就行。
还有,Bind后边不要加IP地址。最好不用Bind函数。用Create一次完成。
在Connect的时候,如果超时(或其它原因)就会出现上面的情况,(//error……)如果你用了从CAsyncSocket派生的方法,就会得到OnConnect消息,可以在里边利用它的参数nErrorCode(具体值请参阅MSDN)来判断连接是否成功不成功的话,可以在此再次调用Connect。
你应该派生CAsyncSocket类,或者CSocket类。从而你可以从基类中获得OnConnect,Onreceive,OnClose等许多事件,通过这些事件你才可能知道你的连接与数据传送是否正确。
一般Client端应该处理的事件是onconnect,onclose,onreceive(如果接收数据)。
Server端应处理onreceive,onclose,onreceive等。
注意,两端都要派生新类。从文档类中生成派生类的对象。
若要详细资料,请联系[email protected]
记住了:CAsyncSocket是非阻塞的,也就是它经常会返回值。当连接时,它返回错误,并不是真的有错。你可以GetLastError()然后判断是否为WSAEWOULDBLOCK,如果是这样,你可以忽略它,事实上已经建立了连接。另外,你用CSOCKET类就不会出现这种情况。因为他是阻塞的。
如果GETLASTERROR()是WSAEWOULDBLOCK的话,就代表连接已经成功,但服务器尚未响应。
你可以忽略这种情况;所以,你的程序应为:
if (SOCKET_ERROR==m_sockRecv.Connect("127.0.0.1",6802))
{
if (GetLastError()!=WSAEWOULDBLOCK)
{
AfxMessageBox("ERRR IN Connect!");
RETURN;
}
{
// TODO: Add your control notification handler code here if (m_IpAddr.IsBlank())
{
AfxMessageBox("You must input host IP!");
return;
};
m_IpAddr.GetWindowText(m_ServerAddr,18); BOOL m_bFlag=ClientSock.Create(0,SOCK_STREAM,FD_CONNECT); if (! m_bFlag)
{
MessageBox("Socket create failed!","Error!",MB_OK|MB_ICONERROR);
PostQuitMessage(0);
return;
}
m_bFlag=ClientSock.Connect(m_ServerAddr,2000);
if(!m_bFlag)
{
int nError=ClientSock.GetLastError ();
if(nError!=WSAEWOULDBLOCK)
{
MessageBox("Connect to host failed!","Error!",MB_OK|MB_ICONERROR);
ClientSock.Close();
//PostQuitMessage(0);
return;
}
else
ClientSock.Connected=TRUE;
ClientSock.AsyncSelect(FD_WRITE); }
return;
}