c socket

失眠改善作者 / 优眠资讯 / 2026-04-19 13:10
"
针对当前热议的c socket话题,我们进行了深入调研和信息整合,力求为您呈现全面客观的内容分析。VC两种socket类比较 一、实现方

针对当前热议的c 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

c++csocket编程 5种模式

api的意思就是应用程序接口,winsock里面的套接字函数就是接口了,也就是api。

可以这样理解,学习winsock就是学习winsock api以及其中的一些机理。因为你用winsock实际上不也就是在用winsock里的函数么。

CAsyncSocket和Csocket都是MFC里的类。微软为了帮助大家做C++开发,同时也为了销售它的VC++,推出了一套用于开发windows程序的C++库叫MFC。

你说的CAsyncSocket和Csocke就是MFC库里关于套接字的类。

CAsyncSocket和Csocke既然是MFC库里的,自然就是一套便利的库,方便你写网络程序。

习惯上如果你是想做MFC程序,那么就直接用CAsyncSocket和Csocke这样的MFC里的方法来开发你的网络程序,如果你不做MFC程序,那么就直接用winsock吧。

还有什么需要补充的么~

1. 构造CSocket对象,如以下的形式:

CSocket Serversocket;

2. 利用CSocket对象的Create()函数创建Windows Socket,Create()函数会调用Bind()函数将此Socket绑定到指定的地址上,其原型为:

BOOL Create (UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, LPCTSTR lpszSocketAddress = NULL);

其中nSocketPort参数指定通信连接的端口号,端口号可以任意指定,但最好不要使用系统默认的一些端口号,例如21是FTP文件传输使用的端口号;

3. Socket创建完毕之后,在服务器端进行监听客户的连接请求,使用如下的代码:

ServerSocket.Listen();

紧接着对于客户端而言,将会调用Connect()函数向服务器发送连接请求,而对于服务器而言,则会调用Accept()函数对客户端发送过来的请求连接进行接受和处理,Accept()函数可以创建一个和监听Socket相同的连接Socket来处理客户的请求,二原来的Socket仍然处于监听状态,使用的形式如下。

客户端:

ClientSocket.Connect(服务器的地址,服务器的端口号);

服务器端:

CSocket ReceiveSocket;

ServerSocket.Accept(连接Socket,客户的地址结构,客户地址结构的长度)

4. 对于数据流服务器类型而言,服务器和客户各自通过调用函数来完成数据的发送和接受,使用如下的语句:

ServerReceive.Receive(缓冲区,缓冲区的长度,接受标志位);

Client.Send(缓冲区,缓冲区的长度,发送标志位);

5. 在客户端与服务器端的数据传输完成之后,调用下述语句,释放Socket所占有的资源。

ServerSocket.Close();

ReceiveSocket.Close();

ClientSocket.Close();

c socket的精彩内容就分享到这里,衷心希望这些信息能为您带来实质帮助。期待您继续支持我们,发现更多有价值的知识。

分享到
声明:本文为用户投稿或编译自英文资料,不代表本站观点和立场,转载时请务必注明文章作者和来源,不尊重原创的行为将受到本站的追责;转载稿件或作者投稿可能会经编辑修改或者补充,有异议可投诉至本站。

热文导读