没有合适的资源?快使用搜索试试~ 我知道了~
使用VC++的网络编程总结
4星 · 超过85%的资源 需积分: 9 36 下载量 175 浏览量
2010-04-20
21:02:06
上传
评论
收藏 553KB DOC 举报
温馨提示
试读
30页
这个资料是我至今舍不得删除的VC++的网络编程总结。非常详细,有条理,而且对socket csocket CAsyncSocket 等的概念,原理分析得非常好,看了你就知道。 1.套接字编程原理 1.1 Client/server通信模型 1.2 Windows Sockets规范 1.3 套接字 1.3.1 套接字定义 1.3.2分类 1.3.3 套接字的作用 1.3.4端口与地址 1.3.5 套接口属性 2.基本的Windows Sockets API编程 2.1常用函数 2.2 TCP实例 2.3 UDP实例 2.4 Socket 通信阻塞的解决方法 3.MFC下的Socket编程的类 3.1 CAsyncSocket类 3.2 CSocket类 3.3 Windows Sockets:带存档的套接字的工作方式 3.4 流式套接字通信的操作顺序 3.5 使用 CAsyncSocket 类 3.6 从套接字类派生 3.7 套接字通知 3.8 一个使用CSocket类的网络通信实例 3.8.1 服务器端应用程序设计(ServerDemo) 3.8.2 客户端应用程序设计(项目名称ClientDemo) 4.套接字的托管实现 4.1 System::Net::Sockets 命名空间 4.2 实例:一个新邮件检查器
资源推荐
资源详情
资源评论
使用 VC++的网络编程总结
1.套接字编程原理
1.1 Client/server 通信模型
1.2 Windows Sockets 规范
1.3 套接字
1.3.1 套接字定义
1.3.2 分类
1.3.3 套接字的作用
1.3.4 端口与地址
1.3.5 套接口属性
2.基本的 Windows Sockets API 编程
2.1 常用函数
2.2 TCP 实例
2.3 UDP 实例
2.4 Socket 通信阻塞的解决方法
3.MFC 下的 Socket 编程的类
3.1 CAsyncSocket 类
3.2 CSocket 类
3.3 Windows Sockets:带存档的套接字的工作方式
3.4 流式套接字通信的操作顺序
3.5 使用 CAsyncSocket 类
3.6 从套接字类派生
3.7 套接字通知
3.8 一个使用 CSocket 类的网络通信实例
3.8.1 服务器端应用程序设计(ServerDemo)
3.8.2 客户端应用程序设计(项目名称 ClientDemo)
4.套接字的托管实现
4.1 System:: Net:: Sockets 命名空间
4.2 实例:一个新邮件检查器
1.套接字编程原理
一个完整的网间通信进程需要由两个进程组成,并且只能用同一种高层协议。也就是
说,不可能通信的一端用 TCP,而另一端用 UDP。一个完整的网络信需要一个五元组来标
识:协议、本地地址、本地端口号、远端地址、远端端口号。
1.1 Client/server 通信模型
在客户/服务器模式中我们将请求服务的一方称为客户(client),将提供某种服务的一
方称为服务器(server)。
一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说服务进程一直
处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。在这个时刻,服务程序
被“惊醒”并且为客户提供服务—对客户的请求作出适当的反应。虽然基于连接的服务是设
计客户机/服务器应用程序时的标准,但有些服务也是可以通过无连接的接口提供的。
客户机/服务器的请求/响应过程示意图如下所示。
图 1 客户/服务器通信模型
通过上面的分析,我们不难理解一个一个完整的网络应用程序包括客户端和服务器两
个部分。客户与服务器进程的作用是非对称的,因此编码不同。服务进程一般是等待客户
请求而启动的,只要系统运行,该服务进程一直存在,直到终止或强迫终止。
1.2 Windows Sockets 规范
Windows Sockets 规范是 90 年代初 Microsoft 公司联合其他几家大公司共同制定的一套
在 Windows 下的二进制兼容网络编程接口规范。它以 U.C.Berkeley 大学 BSD UNIX 中流行
的 Socket 接口为基础,主要在其上扩充了一组针对 Windows 的扩展库函数,增加了符合
Windows 消息驱动特性的网络事件异步选择机制,以使程序员能够充分利用 Windows 消息
驱动机制进行编程。
Windows Sockets 的用途是将基础网络抽象出来,这样,您不必对网络非常了解,并且
您的应用程序可在任何支持套接字的网络上运行。它为应用程序开发者定义了一套简单统
一的 API,并让各家网络软件供应商共同遵守。
Windows Sockets 规范从 90 年代初的 1.0 版本开始,经过不断的完善和发展,目前已经
有了 Windows Sockets 2 版本。值得注意的是,Microsoft 的 MFC 库现在只支持 Windows
Sockets 1 版本,不支持 Windows Sockets 2 版本。
MFC 提供了两个类用以封装 Windows Sockets API。一个是 CAsyncSocket 类,它主要
是提供给那些具有一定网络编程经验,希望同时拥有 Socket API 编程的灵活性和类库编程
便利性的开发者的。另一个是 CSocket 类,它由 CAsyncSocket 类派生,它具有更高的抽象
化,致力于简化网络编程所需的操作。
1.3 套接字
1.3.1 套接字定义
套接字是一个通信终结点,它是 Sockets 应用程序用来在网络上发送或接收数据包的
对象。套接字具有类型,与正在运行的进程相关联,并且可以有名称。目前,套接字一般
只与使用网际协议组的同一“通信域”中的其他套接字交换数据。 使用套接字的应用程序间
通信模型如图 2 所示。
1.3.2 分类
可用的套接字类型有以下两种:
1.3.2.1 流式套接字
流式套接字提供没有记录边界的数据流,即字节流。字节流能确保以正确的顺序无重
复地被送达。
1.3.2.2 数据报套接字
数据报套接字支持面向记录的数据流,但不能确保能被送达,也无法确保按照发送顺
序或不重复。
“有序”指数据包按发送的顺序送达。“不重复”指一个特定的数据包只能获取一次。这两
种套接字都是双向的,是可以同时在两个方向上(全双工)进行通信的数据流。
注意KKK在某些网络协议下(如 XNS),流可以面向记录,即作为记录流而非字节流。
但在更常用的 TCP/IP 协议下,流为字节流。Windows Sockets 提供与基础协议无关的抽象
化级别。
1.3.3 套接字的作用
套接字的作用非常大,至少在下面三种通信上下文中如此:
客户端/服务器模型。
对等网络方案,如聊天应用程序。
通过让接收应用程序将消息解释为函数调用来进行远程过程调用 (RPC)。
1.3.4 端口与地址
在网络上,一个套接字的标识主要借助于地址和端口来描述。
套接字的地址指该套接字所在计算机的网络地址,可以为域名或 IP 地址的形式。通常,
创建套接字时不必指明网络地址,只有在拥有多个网络地址的机器时,才需要显式指定一
个网络地址。
同一机器上可以运行多个网络应用程序,每个应用程序都有自己的套接字用以进行网
络通信,此时如果只有地址标识套接字,则当一个通信包到达机器时,将无法确定究竟是
哪个应用程序的套接字需要接收此信息。由此增加了端口的概念,以协助区分同一机器上
不同应用程序的套接字。
端口用于标识进程,同一机器上不同的网络应用程序各有不同的端口,这样,通过“网
络地址+端口号”的标识方法,便唯一标识了机器上的应用程序了。
某些端口是专门为公共服务保留的(Ftp:21,http:80),除非程序是要提供这些服务,
否则应尽量避免使用这些端口。一般来说,端口 1024 以前的端口号都是系统保留的或是作
为公共服务的,应尽量选择大于 1024 的端口号,以避免冲突。
1.3.5 套接口属性
套接口有一系列的属性用于标识套接口的状态等信息,它们的属性如表 1 所示。
表 1 套接口属性
选项 类型 含义 缺省值
SO_ACCEPTCON BOOL
套接口正在监听
FALSE
SO_BROADCAST BOOL
套接口设置为可发送广播数据
FALSE
SO_DEBUG BOOL
允许 Debug
FALSE
SO_DONTLINGER BOOL
是否禁止 SO_LINGER 选项
TRUE
SO_DONTROUTE BOOL
路由被禁止
FALSE
SO_ERROR int
得到并且清除错误状态
0
SO_KEEPALIVE BOOL
活跃信息正在被发送
FALSE
SO_LINGER struct
返回目前的 linger 信息
1_onoff
SO_OOBINLINE BOOL
带外数据正在普通数据流中被接收
FALSE
SO_RCVBUF int
接收缓冲区大小 与具体实现有关
SO_REUSEADDR BOOL
该套接口捆绑的地址可否被他人使用
FALSE
SO_SNDBUF int
发送缓冲区大小 与具体实现有关
SO_TYPE int
套接口类型 与接口类型有关
TCP_NODELAY BOOL
禁止采用 Nagle 进行合并传送 与具体实现有关
可以通过 getsockopt()函数获取套接口的属性,也可以通过 setsockopt()函数设置套接
口的属性。
2. 基本的 Windows Sockets API 编程
需要在程序中添加下面的包含语句:#include<winsock2.h>
使用 vc++编译时需添加编译链接依赖项 ws2_32.lib 库
协议寻址
在 winsock 中,应用程序通过 sockaddr_in 结构来指定 IP 地址和服务端口信息
sockaddr_in internetAddr;
int nPortID=5320;
internetAddr.sin_family=AF_INET;
internet.sin_addr.s_addr=inet_addr(“202.202.42.88”); //INADDR_ANY
internet.sin_port=htons(nPortID);
ip 地址不容易记忆,还提供了许多地址和名称解析函数如 gethostbyname,gethostbyaddr 等。
2.1 常用函数
1)WSAStartup 调用 windows Socket DLL
函数原型 int WSAStartup(
WORD wVersionRequested, //应用程序要求的 sockets 版本
LPWSADATA lpWSAData //指向数据结构 WSDATA 的指针,
//得到 windows Socket 的具体信息
);
WSDATA 定义如下:
typedef struct WSAData {
WORD wVersion;
WORD wHighVersion;
#ifdef _WIN64
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
#else
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
#endif
} WSADATA, FAR * LPWSADATA;
2)WSACleanup 结束对 Windows Sockets DLL 的调用
函数原型:int WSACleanup(void);
3)socket 用于建立 Sockets。
函数原型:SOCKET socket(
int af, //地址族,一般是 AF_INET
int type , //socket 类型,SOCK_STREAM 或 SOCK_DGRAM
int protocol //协议类型,通常取值 0
);
4)closesocket 关闭套接字
函数原型:int closesocket(
SOCKET s //要关闭的套接字
);
5)bind 将一个本地地址和一个 SOCKET 描述字连接起来
函数原型:int bind(
SOCKET s, //要绑定的套接字
const struct sockaddr FAR* name, //指向 SOCKADDR 结构的地址
int namelen //地址结构的 sizeof
)
Tcp/ip SOCKADDR 结构
struct sockaddr{
unsigned short sa_family;
char sa_data[4];
};
剩余29页未读,继续阅读
资源评论
- xiaoniuguohe2013-02-01比较基础,也比较全面。其实看看孙鑫的VC++也够了。
hbhjhbvhj
- 粉丝: 10
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功