Windows Socket 编程

WinSock规范是一套开放的、支持多种协议的Windows下的网络编程接口。从1991年的1.0版到1995年的2.0.8版,经过不断完善,已成为Windows网络编程的事实上的 ...
展开查看详情

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