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什么时候是有效的呢?
...全文
47 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yarao 2002-08-15
  • 打赏
  • 举报
回复
成功了,感谢,感谢。

散分
yarao 2002-08-15
  • 打赏
  • 举报
回复
各位大虾指点的好,我试一试先。

“使用Socket API”,Scoket API我就闲它编程麻烦,MFC的framework提供了那么好的notify我觉得用着舒服。
huangbeyond 2002-08-15
  • 打赏
  • 举报
回复
何必使用CAsyncSocket,
使用Socket API.
wanglei888 2002-08-15
  • 打赏
  • 举报
回复
对非阻塞CAsyncSocket而言,服务器端的socket在调用Listen之后,不能马上调用Accept,而是要在OnAccept事件发生的时候再调用Accept,返回一个新的newSocket,并且通过这个newSocket给客户端发送数据。

// 声明一个成员变量用来保存客户端的所有连接
CList<CMySocket*,CMySocket*> m_pSockets;

void CMySocket::OnAccept( int nErrorCode ){
ASSERT( _pDlg );
_pDlg->m_disp.SetWindowText("Conneted");
TRACE1( "nErrorCode %d",nErrorCode );
CMySocket * pSocket = new CMySocket(_pDlg);
Accept(pSocket);
m_pSockets.AddHead(pSocket);


}
alanwang_ 2002-08-15
  • 打赏
  • 举报
回复
你不能在Listen之后立刻调用Accept,而应该等FD_ACCEPT消息到来之后,在OnAccept中调用Accept函数
alanwang_ 2002-08-15
  • 打赏
  • 举报
回复
在CMySocket::OnAccept中必须调用Accept,将会得到一个新的CAsyncSocket,用这个新的socket与客户端通信

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧