- 快召唤伙伴们来围观吧
- 微博 QQ QQ空间 贴吧
- 文档嵌入链接
- <iframe src="https://www.slidestalk.com/u22/windows_socket_yik4x5?embed" frame border="0" width="640" height="360" scrolling="no" allowfullscreen="true">复制
- 微信扫一扫分享
Windows Socket 编程
展开查看详情
1 .计算机网络课程设计
2 .成绩评定: 总评成绩: 考勤 20%+ 效果 25%+ 提问 25%+ 课设报 告 30% 中期检查为周五 2
3 .选题方式: 选题的题号:学号位数模 5+1 : 比如: 201503302 刘子豪 同学的选题为: 2%5+1=3 刘子豪同学的选题为第 3 题 3
4 .题目: 题目 1 :基于 TCP 协议的简易聊天机器人 题目 2 :基于 TCP 协议的通讯录 题目 3 :基于 UDP 协议的简易聊天机器人 题目 4 : 标准 C 语言实现简单 Web 服务器 题目 5 :标准 c 语言局域网文件传输 题目 6 :标准 c 语言实现 CGI 通讯录 题目 7 : div+css 网页页面效果制作 课程设计网站: http://keshe.zuoyexitong.com 4
5 .课程设计内容: 内容一 Windows Socket 编程 内容二 公共网关接口CGI 内容三 DIV+CSS网页效果制作 5
6 .Windows Socket 编程 课程设计目的 Socket 编程 常用 API 课程设计软件 6
7 .课程设计目的 通过编程了解 Client/Server 结构的网络通信模 型 掌握 Socket 机制的工作原理 掌握基于 Client/Server 结构的 Windows Socket TCP/UDP 程序设计方法 7
8 .Client-Server 结构 在 TCP/IP 网络环境下,不同主机上的两个应用程 序通信普遍采用客户端 - 服务器模型 ( client- server architecture, C/S ) Client 在需要服务时向 server 提出申请 Server 等待 client 提出请求并予以相应 Server 始终运行,监听网络接口 收到 client 请求启动服务进程响应客户, 同时继续监听服务窗口,保证后续的 client 也能及时得到服务 8
9 .背景知识—— Windows Socket 是什 么? Windows Sockets 是 Microsoft 80 年代初,美国国防部高级研究计划 Windows 的网络程序设计接口 局 (ARPA) 给 UC Berkeley 提供了资金,让 Socket 于 1981 年在 BSD4.1 他 们 在 UNIX 操 作 系 统 下 实 现 TCP/IP 协 UNIX 中提出 议。在这个项目中,研究人员为 TCP/IP 网 络通信开发了一个 API( 应用程序接口 ) , 客户端 / 服务器模型 这个 API 称为 Socket 接口 ( 套接字 ) 。今 socket 天 Socket 接口是 TCP/IP 网络最为通用的 API ,也是在 Internet 上进行应用开发最为 通用的 API 。 一个本地的, 90 年代初,由 Microsoft 联合其他几家 应用程序创建的, 公司共同制定了一套 Windows 下的网络编 操作系统控制的接口。 程接口,即 Windows Socket 规范。它是 Berkeley Socket 的重要扩充,主要是增加 通过该接口 了一些异步函数,并增加了符合 Windows 应用进程可以 消息驱动特性的网络事件异步选择机制。 从另一个应用进程 WinSock 规范是一套开放的、支持多种协 发送或者接收消息 议 的 Windows 下 的 网 络 编 程 接 口 。 从 1991 年的 1.0 版到 1995 年的 2.0.8 版, 经过不断完善,已成为 Windows 网络编程 的事实上的标准。 9
10 .Socket 套接字 目标:学习如何建立客户端 / 服务器应用程序, 使用套接字进行通信 套接字 (socket): 应用进程之间的接口,实现端到 端的传输协议 应用层 应用层 套接字 由应用 进程 进程 开发者 控制 传输层 传输层 网络层 网络层 由操作 系统控制 数据链路层 Internet 数据链路层 物理层 物理层 Socket 是应用层与 TCP/IP 协议栈通信的中间软件抽象层 10
11 .WinSock DLL WinSock 与操作系统的关系 应用程序 1 应用程序 2 网络编程接口 ——如 WinSock API 动态链接库 网络通信协议 ——如 TCP/IP 协议 16 位版: WINSOCK.DLL 32 位版: WSOCK32.DLL 操作系统 ——如 Windows 物理通信介质 11
12 .TCP 套接字编程 服务器做好准备 服务器收到客户端连接请 服务器进程必须首先运行 求后,创建新的 socket 用 服务器必须先创建 socket 等 来与客户端通信 待处理客户端的连接请求 允许服务器与多个客户端通 信 源端口号用来识别客户端 客户端与服务器的联系 创建客户端本地的 TCP socket 指明服务器进程的 IP 地址和 端口号 TCP 协议提供了客户 当客户端创建 socket 后,客 端和服务器之间可靠 户端的 TCP socket 与服务器 的,按次序的字节流 TCP socket 建立连接 传输 12
13 .TCP 套接字编程 如同中国移动的 10086 服务 调用 socket() 建立一个套接口 ( 移动建立好一个电 话总机 ) bind() 将该接口和本地 IP 地址和 Port 绑定 ( 设定总 机号为 10086) listen() 让套接口做好侦听准备 ( 随时准备接听电 话) 客户在套接口建立起来之后,便可调用 connect() 连接服务器指定的 Port (用户可拨打 10086 要求 服务) 服务器调用 accept() 来接收客户的连接请求 ( 一旦 有电话就接起 ) 服务器收到请求后,建立新的 socket 来对此连接 服务,原来的 socket 回到监听等待状态 (总机接 电话后转某分机服务,本身继续等待新的电话) 连接建立后, send() 和 recv() 来发送和接收数据 ( 客户与客服对话 ) 数据传送结束,调用 closesocket() 关闭套接口 13 ( 结束请挂机 )
14 .常用 API API (Application Programming Interface) 应用程序接口 DLL 装载 WinSock 服务由动态链接库 WinSock DLL 提供,它完 成 WinSock 的初始化任务,协商 WinSock 的版本支 持,并分配必要的资源。在使用 WinSock API 之前,必 须调用 WSAStartup 函数对其进行初始化。 int WSAStartup(WORD v, (LPWSADATA) &WD) DLL 卸载 当不需 WinSock DLL 的服务时,释放 DLL 所使用的资 源,需调用 WSACleanup 函数终止对 WinSock 库的使 用 int WSACleanup() 14
15 .常用 API 创建套接字 : socket() 绑定本地地址: bind() 侦听连接 : listen() 建立套接字连接: accept(), connect() 面向连接的数据传输: send(), recv() 关闭套接字: closesocket() 15
16 .常用 API Socket API 类别:可支持任意的底层协议族 PF_INET : 用于互联网编程 PF_UNIX: 用于 Unix 管道编程 PF_PACKET: 直接访问网络接口 (i.e, 绕过 TCP / IP 协 议栈 ) 两种基本 socket API 分别支持两种传输服务 : SOCK_STREAM: 可靠的,字节流服务 (TCP) SOCK_DGRAM: 非可靠的数据报服务 (UDP) 应用案例 客户端从键盘读取一行字符(数据)并将该数据发送到 服务器; 服务器接收数据后并显示在屏幕上。 16
17 .示例 : C 客户端 (TCP) #include <windows.h> #include <winsock2.h> Socket 编 #include <stdio.h> 程库文件 #include <string.h> #include <conio.h> #define SERVER_PORT 5432 #define MAX_LINE 256 int main(int argc, char * argv[]) { WSADATA WSAData; int WSAreturn; struct hostent *hp; struct sockaddr_in sin; char *host; char buf[MAX_LINE]; int s; int len; 17
18 . 示例 : C 客户端 (TCP) if (argc==2) { host = argv[1]; } 程序参数 else { 处理 fprintf(stderr, "usage: simplex-talk host\n"); exit(1); } WSAreturn = WSAStartup(0x101,&WSAData); if(WSAreturn) { WinSock 的初始化 fprintf(stderr, "simplex-talk: WSA error.\n"); exit(1); } /* translate host name into peer’s IP address */ hp = gethostbyname(host); 将远程主机的名称 if (!hp) { fprintf(stderr, "simplex-talk: unknown host: %s\n", 转换成 IP 地址 host); exit(1); } /* build address data structure */ memset((char *)&sin, 0, sizeof(sin)); 参数初始化 memcpy((char *)&sin.sin_addr, hp->h_addr, hp- >h_length); sin.sin_family = AF_INET; sin.sin_port = htons(SERVER_PORT); 18
19 .示例 : C 客户端 (TCP) /* active open */ if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) { 创建 perror("simplex-talk: socket"); 客户端 socket exit(1); } if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { perror("simplex-talk: connect falied"); 连接服务器 close(s); exit(1); } fprintf(stderr, "client is connecting to %s\n", host); /* main loop: get and send lines of text */ while (fgets(buf, sizeof(buf), stdin)) { 从屏幕读取 buf[MAX_LINE-1] = ’\0’; 字符串 len = strlen(buf) + 1; send(s, buf, len, 0); } WSACleanup(); return 1; } 19
20 .示例 : C 服务器 (TCP) #include <windows.h> Socket 编 #include <winsock2.h> 程库文件 #include <stdio.h> #include <string.h> #define SERVER_PORT 5432 #define MAX_PENDING 5 #define MAX_LINE 256 int main() { WSADATA WSAData; int WSAreturn; /* server address */ struct sockaddr_in sin; struct sockaddr_in remote; char buf[MAX_LINE]; int len; int s, new_s; WSAreturn = WSAStartup(0x101,&WSAData); if(WSAreturn) { WinSock 的初始化 fprintf(stderr, "simplex-talk: WSA error.\n"); exit(1); } 20
21 . 示例 : C 服务器 (TCP) /* build address data structure */ memset((char *)&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons(SERVER_PORT); /* setup passive open */ 在端口 5432 创建 if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) { 欢迎 socket perror("simplex-talk: socket failed."); exit(1); } if ((bind(s, (struct sockaddr *)&sin, sizeof(sin))) < 0) { perror("simplex-talk: bind failed."); exit(1); } printf("server is ready in listening ...\n"); 服务 socket 等待 listen(s, MAX_PENDING); 客户端连接 /* wait for connection, then receive and print text */ while(1) { len = sizeof(struct sockaddr_in); if ((new_s = accept(s, (struct sockaddr *)&remote, &len)) 创建服务客户端的 < 0){ Socket ,并读取信息 perror("simplex-talk: accept failed."); exit(1); } 21
22 .示例 : C 服务器 (TCP) printf("received a connection from %s : \n", inet_ntoa(remote.sin_addr)); while (len = recv(new_s, buf, sizeof(buf), 0)) { 服务器将信息 //printf("received %2d chars:", len); 显示在屏幕上 fputs(buf, stdout); } close(new_s); } while 循环 WSACleanup(); 结束, return 1; } 等待另外的 客户 端连接 22
23 .课程设计环境 VC++ 6.0 23
24 .课程设计内容: 内容一 Windows Socket 编程 内容二 公共网关接口CGI 内容三 DIV+CSS网页效果制作 24