没有合适的资源?快使用搜索试试~ 我知道了~
Windows Socket 学习笔记.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 62 浏览量
2022-07-06
21:10:44
上传
评论
收藏 159KB DOC 举报
温馨提示
试读
32页
Windows Socket 学习笔记
资源推荐
资源详情
资源评论
Windows Socket 学习笔记
Socket( 套 接 字 )
◆ 先 看 定 义 :
typedef unsigned int u_int;
typedef u_int SOCKET;
◆ Socket 相 当 于 进 行 网 络 通 信 两 端 的 插 座 , 只 要 对 方 的 Socket 和 自 己
的 Socket 有通信联 接,双方就可以发 送和接收数据了 。 其 定 义 类 似 于
文 件 句 柄 的 定 义 。
◆ Socket 有 五 种 不 同 的 类 型 :
1、 流 式 套 接 字 (stream socket)
定 义 :
#define SOCK_STREAM 1
流 式 套 接 字 提 供 了 双 向 、 有 序 的 、 无 重 复 的 以 及 无 记 录 边 界 的 数 据 流 服
务 , 适 合 处 理 大 量 数 据 。 它 是 面 向 联 结 的 , 必 须 建 立 数 据 传 输 链 路 , 同
时 还 必 须 对 传 输 的 数 据 进 行 验 证 , 确 保 数 据 的 准 确 性 。 因 此 , 系 统 开 销
较 大 。
2、 数 据 报 套 接 字 (datagram socket)
定 义 :
#define SOCK_DGRAM 2
数 据 报 套 接 字 也 支 持 双 向 的 数 据 流 , 但 不 保 证 传 输 数 据 的 准 确 性 , 但 保
留 了 记 录 边 界 。 由 于 数 据 报 套 接 字 是 无 联 接 的 , 例 如 广 播 时 的 联 接 , 所
以 并 不 保 证 接 收 端 是 否 正 在 侦 听 。 数 据 报 套 接 字 传 输 效 率 比 较 高 。
3、 原 始 套 接 字 (raw-protocol interface)
定 义 :
#define SOCK_RAW 3
原 始 套 接 字 保 存 了 数 据 包 中 的 完 整 IP 头 , 前 面 两 种 套 接 字 只 能 收 到 用
户 数 据 。 因 此 可 以 通 过 原 始 套 接 字 对 数 据 进 行 分 析 。
其 它 两 种 套 接 字 不 常 用 , 这 里 就 不 介 绍 了 。
◆ Socket 开 发 所 必 须 需 要 的 文 件 (以 WinSock V2.0 为 例):
头 文 件 : Winsock2.h
库 文 件 : WS2_32.LIB
动 态 库 : W32_32.DLL
一 些 重 要 的 定 义
1、 数 据 类 型 的 基 本 定 义 : 这 个 大 家 一 看 就 懂 。
typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned int u_int;
typedef unsigned long u_long;
2、 网 络 地 址 的 数 据 结 构 , 有 一 个 老 的 和 一 个 新 的 的 , 请 大 家 留 意 , 如 果
想 知 道 为 什 么 ,
请 发 邮 件 给 Bill Gate。其实 就是计 算机的 IP 地址,不过 一般不用用点分
开 的 IP 地
址 , 当 然 也 提 供 一 些 转 换 函 数 。
◆ 旧 的 网 络 地 址 结 构 的 定 义 , 为 一 个 4 字 节 的 联 合 :
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
#define s_addr S_un.S_addr /* can be used for most tcp & ip code */
//下 面 几 行 省 略 ,反 正 没 什 么 用 处 。
};
其 实 完 全 不 用 这 么 麻 烦 , 请 看 下 面 :
◆ 新 的 网 络 地 址 结 构 的 定 义 :
非 常 简 单 , 就 是 一 个 无 符 号 长 整 数 unsigned long。举 个例子: IP 地 址 为
127.0.0.1 的 网 络 地 址 是 什 么 呢 ? 请 看 定 义 :
#define INADDR_LOOPBACK 0x7f000001
3、 套 接 字 地 址 结 构
(1)、 sockaddr 结 构 :
struct sockaddr {
u_short sa_family; /* address family */
char sa_data[14]; /* up to 14 bytes of direct address */
};
sa_family 为 网 络 地 址 类 型 , 一 般 为 AF_INET,表示该 socket 在 Internet
域 中 进 行 通 信 , 该 地 址 结 构 随 选 择 的 协 议 的 不 同 而 变 化 , 因 此 一 般 情 况
下 另 一 个 与 该 地 址 结 构 大 小 相 同 的 sockaddr_in 结 构 更 为 常 用 ,
sockaddr_in 结 构 用 来 标 识 TCP/IP 协 议 下的地址。换 句 话 说 , 这 个 结 构
是 通 用 socket 地址结 构,而下面的 sockaddr_in 是专 门 针 对 Internet 域
的 socket 地址结 构。
(2)、 sockaddr_in 结 构
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
sin _family 为 网 络 地 址 类 型 , 必 须 设 定 为 AF_INET。sin_port 为 服务 端 口 ,
注 意 不 要 使 用 已 固 定 的 服 务 端 口 , 如 HTTP 的端 口 80 等。如果端口设
置 为 0,则 系统 会自动 分配一个唯一端口 。 sin_addr 为 一 个 unsigned long
的 IP 地址。sin_zero 为 填充字段,纯 粹用来保证 结 构 的 大 小 。
◆ 将 常 用 的 用 点 分 开 的 IP 地 址 转 换 为 unsigned long 类 型 的 IP 地 址 的
函 数 :
unsigned long inet_addr(const char FAR * cp )
用 法 :
unsigned long addr=inet_addr("192.1.8.84")
◆ 如 果 将 sin_addr 设 置 为 INADDR_ANY, 则 表 示 所 有 的 IP 地 址 , 也 即 所
有 的 计 算 机 。
#define INADDR_ANY (u_long)0x00000000
4、 主 机 地 址 :
先 看 定 义 :
struct hostent {
char FAR * h_name; /* official name of host */
char FAR * FAR * h_aliases; /* alias list */
short h_addrtype; /* host address type */
short h_length; /* length of address */
char FAR * FAR * h_addr_list; /* list of addresses */
#define h_addr h_addr_list[0] /* address, for backward compat */
};
h_name 为 主 机 名 字 。
h_aliases 为 主 机 别 名 列 表 。
h_addrtype 为 地 址 类 型 。
h_length 为 地 址 类 型 。
h_addr_list 为 IP 地址,如果该 主机有多个网卡,就 包 括 地 址 的 列 表 。
另 外 还 有 几 个 类 似 的 结 构 , 这 里 就 不 一 一 介 绍 了 。
5、 常 见 TCP/IP 协 议 的 定 义 :
#define IPPROTO_IP 0
#define IPPROTO_ICMP 1
#define IPPROTO_IGMP 2
#define IPPROTO_TCP 6
#define IPPROTO_UDP 17
#define IPPROTO_RAW 255
具 体 是 什 么 协 议 , 大 家 一 看 就 知 道 了 。
套 接 字 的 属 性
为 了 灵 活 使 用 套 接 字 , 我 们 可 以 对 它 的 属 性 进 行 设 定 。
1、 属 性 内 容 :
//允 许 调 试 输 出
#define SO_DEBUG 0x0001 /* turn on debugging info recording */
//是 否 监 听 模 式
#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */
//套 接 字 与 其 他 套 接 字 的 地 址 绑 定
#define SO_REUSEADDR 0x0004 /* allow local address reuse */
//保 持 连 接
#define SO_KEEPALIVE 0x0008 /* keep connections alive */
//不 要 路 由 出 去
#define SO_DONTROUTE 0x0010 /* just use interface addresses */
//设 置 为 广 播
#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs
*/
//使 用 环 回 不 通 过 硬 件
#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible
*/
//当 前 拖 延 值
#define SO_LINGER 0x0080 /* linger on close if data present */
//是 否 加 入 带 外 数 据
#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */
//禁 用 LINGER 选 项
#define SO_DONTLINGER (int)(~SO_LINGER)
//发 送 缓 冲 区 长 度
#define SO_SNDBUF 0x1001 /* send buffer size */
//接 收 缓 冲 区 长 度
剩余31页未读,继续阅读
资源评论
老帽爬新坡
- 粉丝: 79
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功