CAsyncSocket 问题
yarao 2002-08-15 12:59:40 不知道各位用过CAsyncSocket没有CAsyncSocket默认是提供nonblocking的套结字。我在使用这个类时遇到了很多的问题,现今把问题叙述如下,希望有人能够帮我解决。
我继承了类CAsyncSocket CMysocket
MySocket.h
#include <afxsock.h>
#ifndef _MYSOCKET_H
#define _MYSOCKET_H
class CCommDlg;
class CMySocket:public CAsyncSocket{
public:
CMySocket():CAsyncSocket(){}
CMySocket( CCommDlg *pDlg ):CAsyncSocket(){_pDlg = pDlg; }
void SetPWnd( CCommDlg *pDlg ){_pDlg = pDlg ;}
public:
void OnAccept( int nErrorCode );
void OnReceive( int nErrorCode );
private:
CCommDlg *_pDlg;
};
#endif
MySocket.c
#include "stdafx.h"
#include "MySocket.h"
#include "CommDlg.h"
void CMySocket::OnAccept( int nErrorCode ){
ASSERT( _pDlg );
_pDlg->m_disp.SetWindowText("Conneted");
TRACE1( "nErrorCode %d",nErrorCode );
}
void CMySocket::OnReceive( int nErrorCode ){
char szTmp[200];
int i = Receive( (void *)szTmp,200 );
szTmp[i]='\0';
ASSERT( _pDlg );
_pDlg->m_disp.SetWindowText(szTmp);
}
建立了一个Dialog名为CCommDlg在host按钮的OnHost中写了如下代码
//Server端建立
void CCommDlg::OnHost()
{
// TODO: Add your control notification handler code here
m_btjoin.EnableWindow( false );//m_btjoin是一个按钮
_pSocket = new CMySocket( this );//_pSocket,_connect 都是类
CCommDlg的成员变量,类型是CMySocket
_ConnSock.SetPWnd(this);
int port=3214;
if( _pSocket->Create( 3214,SOCK_STREAM,FD_READ|FD_ACCEPT,NULL )==0 )
TRACE1( "error Create %d\n",CAsyncSocket::GetLastError() );
_pSocket->Bind(3214);
_pSocket->Listen();
SOCKADDR saddr;
int i =sizeof( SOCKADDR );
if( _pSocket->Accept(_ConnSock,&saddr,&i)==0 )
TRACE1( "error accept %d\n ",CAsyncSocket::GetLastError() ); //返回错误WSAEWOULDBLOCK但是是正常的
host = true;
}
join按钮建立和Server的连接。
void CCommDlg::OnJoin()
{
// TODO: Add your control notification handler code here
host = false;
m_bthost.EnableWindow( false );
BYTE fd1,fd2,fd3,fd4;
char szIPAddress[255];
m_ip.GetAddress( fd1,fd2,fd3,fd4 );
sprintf( szIPAddress,"%d.%d.%d.%d",fd1,fd2,fd3,fd4 );
_pSocket = new CMySocket( this );
_pSocket->Create();
if( _pSocket->Connect( szIPAddress,3214 )==0 )
TRACE1( "error connected %d",CAsyncSocket::GetLastError() );
}
连接是正常的。我的连接经过调试证明是连接上了
send按钮,发送消息至客户端/服务器端
void CCommDlg::OnSend()
{
// TODO: Add your control notification handler code here
char p[200];
int i = m_content.GetWindowText(p,200);
p[i]='\0';
CString csIp;
UINT port;
if( _ConnSock.GetPeerName(csIp,port)==0 )
TRACE1( " getpeername error:%d",CAsyncSocket::GetLastError() );
TRACE2( "IP %s,Port %d",csIp.GetBuffer(csIp.GetLength()),port );
if( host ){
if( _ConnSock.Send( (void *)p,i)==SOCKET_ERROR )
TRACE1( "server :send error%d",CAsyncSocket::GetLastError() );
}else
if( _pSocket->Send( (void *)p,i)==SOCKET_ERROR ){
TRACE1("send error %d",CAsyncSocket::GetLastError());
}
}
client向server发送是函数返回是正常的,只是server端收不到信息。但是当server向客户端发信息的时候函数返回出错,返回的是WSAENOTSOCK就是说_ConnSock中并没有得到一个有效的socket。因为是异步的,所以accept返回时无法判断_ConnSock是否有效。那么_ConnSock什么时候是有效的呢?