中易网

开发网络程序,是使用Winsock API 还是使用MFC提供的Socket类

答案:2  悬赏:0  
解决时间 2021-01-09 18:16
开发网络程序,是使用Winsock API 还是使用MFC提供的Socket类
最佳答案
VC两种socket类比较

一、实现方法

  微软的MFC把复杂的WinSock API函数封装到类里,这使得编写网络应用程序更容易。CAsyncSocket类逐个封装了WinSock API,为高级网络程序员提供了更加有力而灵活的方法。这个类基于程序员了解网络通讯的假设,目的是为了在MFC中使用WinSock,程序员有责任处理诸如阻塞、字节顺序和在Unicode与MBCS 间转换字符的任务。为了给程序员提供更方便的接口以自动处理这些任务,MFC给出了CSocket类,这个类是由CAsyncSocket类继承下来的,它提供了比CAsyncSocket更高层的WinSock API接口。Csocket类和CsocketFile类可以与Carchive类一起合作来管理发送和接收的数据,这使管理数据收发更加便利。CSocket对象提供阻塞模式,这对于Carchive的同步操作是至关重要的。阻塞函数(如Receive()、Send()、ReceiveFrom()、SendTo() 和Accept())直到操作完成后才返回控制权,因此如果需要低层控制和高效率,就使用CasyncSock类;如果需要方便,则可使用Csocket类。

  CSocket类是由CAsyncSocket继承而来的,事实上,在MFC中CAsyncSocket 逐个封装了WinSock API,每个CAsyncSocket对象代表一个Windows Socket对象,使用CAsyncSocket 类要求程序员对网络编程较为熟悉。相比起来,CSocket类是CAsyncSocket的派生类,继承了它封装的WinSock API。

  一个CSocket对象代表了一个比CAsyncSocket对象更高层次的Windows Socket的抽象,CSocket类与CSocketFile类和CArchive类一起工作来发送和接收数据,因此使用它更加容易使用。CSocket对象提供阻塞模式,因为阻塞功能对于CArchive的同步操作是至关重要的。在这里有必要对阻塞的概念作一解释:一个socket可以处于"阻塞模式"或"非阻塞模式",当一个套接字处于阻塞模式(即同步操作)时,它的阻塞函数直到操作完成才会返回控制权,之所以称为阻塞是因为此套接字的阻塞函数在完成操作返回之前什么也不能做。如果一个socket处于非阻塞模式(即异步操作),则会被调用函数立即返回。在CAsyncSocket类中可以用GetLastError 成员函数查询最后的错误,如果错误是WSAEWOULDBLOCK则说明有阻塞,而CSocket绝不会返回WSAEWOULDBLOCK,因为它自己管理阻塞。微软建议尽量使用非阻塞模式,通过网络事件的发生而通知应用程序进行相应的处理。但在CSocket类中,为了利用CArchive 处理通讯中的许多问题和简化编程,它的一些成员函数总是具有阻塞性质的,这是因为CArchive类需要同步的操作。

  在Win32环境下,如果要使用具有阻塞性质的套接字,应该放在独立的工作线程中处理,利用多线程的方法使阻塞不至于干扰其他线程,也不会把CPU时间浪费在阻塞上。多线程的方法既可以使程序员享受CSocket带来的简化编程的便利,也不会影响用户界面对用户的反应。

  CAsyncSocket类编程模型

  在一个MFC应用程序中,要想轻松处理多个网络协议,而又不牺牲灵活性时,可以考虑使用CAsyncSocket类,它的效率比CSocket 类要高。CAsyncSocket类针对字节流型套接字的编程模型简述如下:

  1、构造一个CAsyncSocket对象,并用这个对象的Create成员函数产生一个Socket句柄。可以按如下两种方法构造:

CAsyncSocket sock; //使用默认参数产生一个字节流套接字
Sock.Create();
   或在指定端口号产生一个数据报套接字

CAsyncSocket*pSocket=newCAsyncSocket;
int nPort=27;
pSocket->Create(nPort,SOCK-DGRAM);

  第一种方法在栈上产生一个CAsyncSocket对象,而第二种方法在堆上产生CAsyncSocket对象;第一种方法中Create()成员函数用缺省参数产生一个字节流套接字,第二种方法中用Create()成员函数在指定的端口产生一个数字报套接字。Create()函数的原型为:

BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM,
LPCTSTR lpszSocketA
全部回答
使用MFC提供的Socket类比较方便。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
想问一下,压铸模温机冷却模具有什么作用?
海贼王乔巴在第几集出现
蓝光机与其实EVD机有什么区别呢
无法上网怎么办?
脸上只有一张大嘴的人是什么恐怖电影
听说宜泉资本还可以,那么宜泉资本可靠吗?安
例题2怎么做?
1,2分钟到家房屋3000 2,1个小时到家房租150
22号电影频道播放的电影有哪些
我应该是一只什么样的队伍,龙华机训
3.1'英尺等于多少毫米
澄海猛狮广场星辰电影院节目单
《容忍与自由》中“绝对之是”时援引事例
光玲五金灯饰地址有知道的么?有点事想过去
泡妞和喜欢一个人有区别吗?
推荐资讯
隶书是什么字体
为什么男生要长喉结哟?
魔域BB帮我取个好听的名字?
小明听后脸红了,他向完桌椅深深地鞠了躬,说
一张对开等于多少个十六开
cf客户端大妈错误19-0是怎么回事,我绝没用G
听到一首歌,是英文女声摇滚,开头是很有节奏
小七手游ios充值折扣的优惠多吗
深圳罗湖地铁到香港要多少时间!
阴阳师辅助挂机的话,有没有比较好的软件啊?
资本主义国家在20世纪20年代经济增长的原因
奔驰GLK300和路虎神行2比较
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?