网络编程 C++ ———MFC Socket

网络编程 C++ ———MFC Socket

MFC 中封装了CAsyncSokect 类和CSocket类 ,置于类库之中。CAsyncSokect 类要求程序员对网络通信和套接字编程模式有相当的理解,要程序员机子编程处理阻塞、字节顺序以及Unicode与MBCS之间的转换问题。 CSocket类则比较简单 ,同与之搭配的CSocketFile类和CAchive类编写网络程序更加简单便利。

CAsyncSokect 编程

1)创建Socket

构造CAsyncSokect类,再调用其Create成员方法创建底层套接字。

BOOL Create(
   UINT nSocketPort = 0,
   int nSocketType = SOCK_STREAM,
   long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,     //通知相关窗口的消息
   LPCTSTR lpszSocketAddress = NULL 
);

对于服务器必须指定端口,客户端不指定的话系统自己分配。

例子说明:

CAsyncSokect ssocket;
int port=27;
ssocket.Create(port,SOCK_DRAM);

创建一个数据报套接字 。

CAsyncSokect  * psserver= new CAsyncSocket ;
int port=27;
psscoket->Create(port);

创建一个流式套接字。

CAsyncSokect ClientSocket ;
ClientSocket.Create();

为客户端创建一个流式套接字 。

MFC 定义了一个内部类CSocketWnd,当调用Create函数创建一个套接字时,就会将该套接字连接到一个窗口(CsocketWnd 对象),CAsyncSokect的回调函数DoCallBack函数为该窗口的回调函数。这样当一个网络事件发生时,经过MFC的消息循环,DoCallBack函数会根据不同的事件调用响应的处理函数。MFC将这些函数定义为虚函数,在编程是必须重载需要的消息处理函数。

2) 客户端连接和服务端监听

ClientSocket.Connect(addr,port);

ServerSocket.Listen();

ServerSocket.Accpet(CAsyncSokect & rConnectedsocket);

  1. 数据收发

Send () 、Sendto() 、Receive()ReceiveFrom()

CSocket 编程

CSocket 是CAsyncSokect的派生类 。

1) 创建Socket

Create()函数继承CAsyncSokect的Create()函数 ; 也是一样先构造对象,再调用Create()方法创建套接字。

服务器端:

CSocket sockSrv;

sockSrv.Create(port);

客户端 :

CSocket sockClient ;

sockClient.Create();

2)连接与监听

同CAsyncSokect 一样 。

服务器端:

sockSrv.Listen();

CSocket sockRecv ;

sockSrv.Accept(sockRecv);

客户端:

sockClient.Connect(strAddr,port);

3)数据传输

服务端程序 :

// 创建与CSocket类的对象相连接的CSocketFile类对象。

CSocketFile file(&sockRecv);

//创建与CSocketFile类的对象相连接的CAchive类对象,用于存放要发送的数据 ;

CAchive arin(&file,CAchive ::load);

//创建与CSocketFile类的对象相连接的CAchive类对象,用于存放接收的数据 ;

CAchive arout(&file,CAchive ::load);

arin>>dwValue; //发送数据dwVlaue

arout<<dwValue; // 接收数据dwVlaue

客户端程序:

// 创建与CSocket类的对象相连接的CSocketFile类对象。

CSocketFile file(&sockClient);

//创建与CSocketFile类的对象相连接的CAchive类对象,用于存放要发送的数据 ;

CAchive arin(&file,CAchive ::load);

//创建与CSocketFile类的对象相连接的CAchive类对象,用于存放接收的数据 ;

CAchive arout(&file,CAchive ::load);

arin>>dwValue; //发送数据dwVlaue

arout<<dwValue; // 接收数据dwVlaue

  1. 释放资源

网络通信结束后,对于栈中的类对象会自动调用其析构函数。 对于队中的则需要delete 手动释放 。

除了利用CSocketFile 类的对象和CAchive类的对象辅助数据传输外,利用CSocket的成员函数(Send ()、SendTo()、Receive()、ReceiveFrom())同样可以实现数据传输。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
环境:Windows XP SP3、 VC++ 6.0、 Windows 2003 SDK 使用步骤: 1、下载解压之后,使用VC++ 6.0打开两个工程:一个是SocketServer和一个ClientSocket工程。 2、首先运行服务器端工程,选默认的端口1008 3、然后运行客户端工程,选默认的端口1008和默认的服务器地址 4、再运行多个客户端进程 5、如果一切正常,可以每个客户端的消息发送,我们可以在服务端和各个客户端同步看到消息 实现一个服务器对多个客户端的关键是,在服务端的使用集合CPtrList类用保存客户端的socket对象,思想与Java中的编程思想一样,只不过Java中会使用多线程技术,在Vector集合保存客户端的socket对象,而MFC框架提供了CSocket类,它是一个异步通信的类,所以看上去代码比较Java的多线程代码简单的实现了一个对多的即时通讯功能。另外,MFC提供了CSocketFile类和CArchive类与CSocket类实现了C++的网络通讯编程功能。 本示例注释非常详细,所有的辅助类都放一个util目录中,然后在工程中分了一个目录来管理这些辅助类,使用代码非常清晰。手动书写部分的代码是按Java的规范书写,当然其它代码由IDE生成的,所以是MS的风格,所以当你看代码时,只要是使用“骆驮命名法”的方法都是本人书写的功能性代码。 参看的思路:在服务端要从回调方法onAccept读起;而客户端代码主要从OnSendButton方法读起,即可理解整个代码的意思。 阅读对象:具有JavaSocket编程经验的人员,并且希望能够书写出比Java效率更高的即时通讯程序的人员

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值