没有合适的资源?快使用搜索试试~ 我知道了~
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 实例:一个新邮件检查器 5. 怎样实现服务器端多线程的socket 功能?
资源推荐
资源详情
资源评论
使用 VC++
VC++
VC++
VC++ 的网络编程总结
1 .套接字编程原理
1.1 C lient/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 实例:一个新邮件检查器
5 . 怎样实现服务器端多线程的 socket 功能?
1
1
1
1 .套接字编程原理
一个完整的网间通信进程需要由两个进程组成 , 并且只能用同一种高层协议 。 也就是说
,
不可能通信的一端用 TCP ,而另一端用 UDP 。一个完整的网络信需要一个五元组来标识:
协议、本地地址、本地端口号、远端地址、远端端口号。
1.1
1.1
1.1
1.1 C
C
C
C lient/server
lient/server
lient/server
lient/server 通信模型
在客户 / 服务器模式中我们将请求服务的一方称为客户 ( client ) , 将提供某种服务的一方
称为服务器( server ) 。
一个服务程序通常在一个众所周知的地址监听对服务的请求 , 也就是说服务进程一直处
于休眠状态 , 直到一个客户对这个服务的地址提出了连接请求 。 在这个时刻 , 服务程序被 “ 惊
醒 ” 并且为客户提供服务 — 对客户的请求作出适当的反应 。 虽然基于连接的服务是设计客户
机 / 服务器应用程序时的标准,但有些服务也是可以通过无连接的接口提供的。
客户机 / 服务器的请求 / 响应过程示意图如下所示。
图 1 客户 / 服务器 通信模型
通过上面的分析 , 我们不难理解一个一个完整的网络应用程序包括客户端和服务器两个
部分 。 客户与服务器进程的作用是非对称的 , 因此编码不同 。 服务进程一般是等待客户请求
而启动的,只要系统运行,该服务进程一直存在,直到终止或强迫终止。
1.2 Windows Sockets 规范
Windows Sockets 规范 是 9 0 年代 初 Microsof t 公司联合其他几家大公司共同制定的一套
在 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.3
1.3 套接字
1.3.1
1.3.1
1.3.1
1.3.1 套接字 定义
套接字是一个通信终结点 , 它是 Sockets 应用程序用来在网络上发送或接收数据包的对
象 。 套接字具有类型 , 与正在运行的进程相关联 , 并且可以有名称 。 目前 , 套接字一般只与
使用网际协议组的同一 “ 通信域 ” 中的其他套接字交换数据 。 使用套接字的应用程序间通信模
型如图 2 所示。
应用程序
A
A
A
A
套接字
A
A
A
A
应用程序
B
B
B
B
套接字
B
B
B
B
图
2
2
2
2
套接字通信模型
1.3.2
1.3.2
1.3.2
1.3.2 分类
可用的套接字类型有以下两种:
1.3.2.1
1.3.2.1
1.3.2.1
1.3.2.1 流式套接字
流式套接字提供没有记录边界的数据流,即字节流。字节流能确保以正确的顺序无重
复地被送达。
创建并初始化套接字
监听来自客户机的请求
接受连接请求
接收数据
发送数据
关闭连接
创建并初始化套接字
请求建立连接
发送数据
接收数据
关闭连接
服务器
客户机
图
3
流式套接字 ( 有连接通信 )
编程
1.3.2.2
1.3.2.2
1.3.2.2
1.3.2.2 数据报套接字
数据报套接字支持面向记录的数据流,但不能确保能被送达,也无法确保按照发送顺
序或不重复。
创建并初始化套接字
监听来自客户机的请求
进行处理
发送结果给客户端
关闭连接
创建并初始化套接字
向服务器发出请求
接收结果
关闭连接
服务器
客户机
图
4
4
4
4
数据报套接字
(
无连接通信
)
)
)
)
编程
“ 有序 ” 指数据包按发送的顺序送达 。 “ 不重复 ” 指一个特定的数据包只能获取一次 。 这两
种套接字都是双向的,是可以同时在两个方向上(全双工)进行通信的数据流。
注意 在某些网络协议下(如 XNS ) ,流可以面向记录,即作为记录流而非字节流 。 但
在更常用的 TCP/IP 协议下 , 流为字节流 。 Windows Sockets 提供与基础协议无关的抽象化
级别。
1.3.3
1.3.3
1.3.3
1.3.3 套接字的作用
套接字的作用非常大,至少在下面三种通信上下文中如此:
� 客户端 / 服务器模型。
� 对等网络方案,如聊天应用程序。
� 通过让接收应用程序将消息解释为函数调用来进行远程过程调用 (RPC) 。
1.3.4
1.3.4
1.3.4
1.3.4 端口与地址
在网络上,一个套接字的标识主要借助于地址和端口来描述。
套接字的地址指该套接字所在计算机的网络地址 , 可以为域名或 IP 地址的形式 。 通常
,
创建套接字时不必指明网络地址 , 只有在拥有多个网络地址的机器时 , 才需要显式指定一个
网络地址。
同一机器上可以运行多个网络应用程序,每个应用程序都有自己的套接字用以进行网
络通信 , 此时如果只有地址标识套接字 , 则当一个通信包到达机器时 , 将无法确定究竟是哪
个应用程序的套接字需要接收此信息 。 由此增加了端口的概念 , 以协助区分同一机器上不同
应用程序的套接字。
端口用于标识进程 , 同一机器上不同的网络应用程序各有不同的端口 , 这样 , 通过 “ 网
络地址 + 端口号 ” 的标识方法,便唯一标识了机器上的应用程序了。
某些端口是专门为公共服务保留的( Ftp:21,http:80 ) ,除非程序是要提供这些服务,否
则应尽量避免使用这些端口。一般来说,端口 1024 以前的端口号都是系统保留的或是作为
公共服务的,应尽量选择大于 1024 的端口号,以避免冲突。
1.3.5 套接口属性
套接口有一系列的属性用于标识套接口的状态等信息,它们的属性如表 1 所示。
表 1
1
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 B OOL 该套接口捆绑的地址可否被他人使用 FALSE
SO_SNDBUF
int
发送缓冲区大小 与具体实现有关
SO_TYPE
int
套接口类型 与接口类型有关
TCP_NODELAY BOOL 禁止采用 Nagle 进行合并传送 与具体实现有关
可以通过 getsockopt()
getsockopt()
getsockopt()
getsockopt() 函数获取套接口的属性 , 也可以通过 setsockopt()
setsockopt()
setsockopt()
setsockopt() 函数设置套接口
的属性。
2.
2.
2.
2. 基本的 Windows
Windows
Windows
Windows Sockets
Sockets
Sockets
Sockets API
API
API
API 编程
�
�
�
� 需要在程序中添加下面的包含语句: #include<winsock2.h>
#include<winsock2.h>
#include<winsock2.h>
#include<winsock2.h>
�
�
�
� 使用 vc++
vc++
vc++
vc++ 编译时需添加编译链接依赖项 ws2_32.lib
ws2_32.lib
ws2_32.lib
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
2.1
2.1
2.1 常用函数
1 ) WSAStartup 调用 windows Socket DLL
函数原型
int
WSAStartup(
WORD wV ersionRequested, // 应用程序要求的 sockets 版本
LPWSADATA lpWSAData // 指向数据结构 WSDATA 的指针,
// 得到 windows Socket 的具体信息
) ;
WSDATA 定义如下:
typedef struct WSAData {
WORD wV ersion;
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
)
T
cp/ip SOCKADDR 结构
struct sockaddr{
unsigned short sa_family;
char sa_data[4];
};
剩余33页未读,继续阅读
资源评论
jkga460
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功