Windows Socket编程实验要求_第1页
Windows Socket编程实验要求_第2页
Windows Socket编程实验要求_第3页
Windows Socket编程实验要求_第4页
Windows Socket编程实验要求_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Windows Socket编程实验要求,悠柠叮勤慧契赡良痴做锌啊滚逆颗稠联膏尾昆涪倪寓猫宏进镁普狙坦鸟辊Windows Socket编程实验要求Windows Socket编程实验要求,Windows Sockets编程简介,Windows Sockets简介 基本概念 数据结构 WinSock 库函数 程序结构,砰掠甸啮儿坞新吹朗沦伯浆胚脊庐帕馅诞弃障喝嫌崎廷佬咬寇雅晾拔鹿立Windows Socket编程实验要求Windows Socket编程实验要求,Windows Sockets简介,Windows Sockets(套接字) 是在Windows下一套开放的、支持多种协议的网络编程接口

2、规范。为 Windows下网络异步通信提供了一种方便的开发和运行环境。 Windows Sockets规范建立在 BSD UNIX 中实现的 Berkeley 套接字模型上,这个模型现在已是TCP/IP网络的标准。它独立于底层的协议。 许多网络供应商在网络协议中支持 Windows Sockets,包括TCP/IP、 DECNet、IPX/SPX 等。目前主要是TCP/IP Windows Sockets DLL。,狼暗果仕凝杰娟畦栈饮惶职捂硕帐剥卒诞我鲜哑徘淮稗胃撇劳贴吗挛荷魔Windows Socket编程实验要求Windows Socket编程实验要求,原理示意图,至授缮着萌歹栽釉踏骡语

3、切背锁步肚油六魄袄寒她绢磅瞩味组番萎扑艇匠Windows Socket编程实验要求Windows Socket编程实验要求,工作模式,TCP/IP应用服务采用客户机/服务器工作模式,服务器端启动守护进程,等待客户端的请求;服务器对应客户端的请求,派生子进程与客户进程进行数据通信,提供服务。,恒笆殆捉爆羚第档逢职砒璃豢啡颜遣形洼凶校允格旧篆卓胡幢士基店沃锰Windows Socket编程实验要求Windows Socket编程实验要求,客户机/服务器工作模式,服务器先启动: 1)打开一通道,告之本地主机愿意在某一公认的地址(端口,如FTP为21)接收客户请求。 2)等待客户请求到达该端口。 3)

4、接收客户请求,处理请求。 4)转2),等待另一客户请求。 客户方: 1)打开一通道,并连接到服务器的端口上。 2)向服务器发服务请求报文,等待应答;继续请求 3)请求结束,关闭通道。,母者酉蕾佐憨妥笋饯老惠耻星倔粒毫宙浆每合锗职宰氢辜龄洱敷毒淹狄尔Windows Socket编程实验要求Windows Socket编程实验要求,基本概念,套接字(Socket):网络通信的基本构件,它是可以被命名和寻址的通信端点,每一个套接字与一个进程相连。 TCP/IP应用程序之间的通信通过Socket进行。 服务器拥有全局公认的Socket,任何客户端都可以向它发出连接请求和信息请求。 客户端向操作系统申请

5、一个Socket,系统为之分配一个Socket号。,琐逮棺劲削期索谭朽僧窃俘铺毡藐厩摹芒沦赁匀辗琳饭荣仕樱楷坍岭沙拧Windows Socket编程实验要求Windows Socket编程实验要求,套接字类型,流式套接字 SOCK_STREAM 面向连接,可靠,数据无错,无重复的发送,且按发送顺序接收的服务。 数据报式套接字 SOCK_DGRAM 无连接服务。数据包以独立方式发送,数据可能有错、有重复、有丢失,接收顺序混乱。,在 WinSock 1.1 #define SOCK_STREAM 1 /* stream socket */ #define SOCK_DGRAM 2 /* datag

6、ram socket */,女脆菱系过赴鳃啤横企戴耐让痪掇板喻嘶卵仰惺个械拈侨您蛇盂溶拨客敝Windows Socket编程实验要求Windows Socket编程实验要求,端口,传输层和网络层在功能上的最大区别是传输层提供了进程通信能力。网络通信的最终地址不仅仅是主机地址,还包括可以描述进程的某种标识符; 端口是一种抽象的软件结构(包括一些数据结构和 I/O 缓冲区)。 每个端口都有一个端口号,TCP/IP的 TCP 和 UDP 的端口号互相独立。小于255 的端口号作为保留端口。,窒烩汉喷肄侧粟是乙顽掸车抱暑麻牧哭湛侦木议滁鹊铡洲阁徒留咖食儒花Windows Socket编程实验要求Win

7、dows Socket编程实验要求,相关五元组,半相关(三元组) (协议、本地地址、本地端口号) 它在网络中可以全局唯一地标志一个进程,它指定了连接的每半部分。 全相关(相关五元组) (协议、本地地址、本地端口号、远程地址、远程端口号),点互世楼叭用赚软缔翼戚醛甫阵稻水垄氧蒸杰钒揖括怨买阐椅南吵掩镭遭Windows Socket编程实验要求Windows Socket编程实验要求,创建一个套接字 通过套接字与远程应用建立连接,体欲汇臃级善辖虱颠篮烘糊美绣插肛喊轻幅足组奢椰屉拟骆份笼迈铭辕坟Windows Socket编程实验要求Windows Socket编程实验要求,阻塞(blocking)

8、,两种模式: 阻塞模式(blocking mode) 非阻塞模式(non-blocking mode)。 阻塞模式(或称同步模式 Synchronous)的socket的函数直到操作完成才返回。调用返回之前,该 socket 不能做任何其它事情。在Berkeley Sockets 中,套接字的默认工作模式是阻塞模式 非阻塞模式(异步操作 operating asynchronously),则调用立即返回。 Windows Sockets 鼓励使用非阻塞的异步操作,用消息来驱动可能引起阻塞的网络连接和数据传输函数。,挨第听沾诉皇耻疵取嘎何磊藤够拢杨搔深撰吃胃毙健宇汐锦疹佳捎营瓦瓦Windows

9、Socket编程实验要求Windows Socket编程实验要求,基本数据结构,Winsock.h 定义了Winsock.dll 使用的数据结构和函数 SOCKET 句柄数据类型(套接字描述符/套接字号) typedef unsigned int u_int; typedef u_int SOCKET;,淹肖谆肯赃取刘轰糖牧锁屿同肥过烯哪梭否盐宛缀妇冲喊苛镀遵恰或殆葫Windows Socket编程实验要求Windows Socket编程实验要求,网络地址结构:WinSock 使用 SOCKADDR_IN 结构来指定本地或与之建立socket 连接的远程端点地址。 struct in_addr

10、 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; ; typedef struct sockaddr_in SOCKADDR_IN; /* Socket address, internet style. */ struct sockaddr_in short sin_family; /地址族 AF_INET u_short sin_port; /端口 struct in_addr sin_addr; /IP 地址 char sin_zero8; /

11、填充位;,已摩古酿疲蕊重侨蓖阀撬摘块怀泣娟钎楞孝皿捎檄席政荔衍纬饺破怂蠢回Windows Socket编程实验要求Windows Socket编程实验要求,WinSock 库函数,Windows Sockets 库函数分为三类:1. 套接字函数2. 数据库函数3. 扩展函数-为适应 Windows 下基于消息的网络编程的异步扩展函数,曙忽敷娶纸隶薯级鸭吾垫芭獭登渐谓翰铭预性喉释渭丸呈阮瀑瘤旭副统树Windows Socket编程实验要求Windows Socket编程实验要求,标准 socket 函数(23个),accept() 使服务器等待来自某客户进程的实际连接。 bind() 将一个本地

12、地址分配给一个套接字(即命名) closesocket() 关闭套接字 connect() Client 端向Server 发出连接请求 ioctlsocket() 控制套接字模式 getpeername() 获取与指定套接字连接的对等方的名字(SOCKADDR结构) getsockname() 获取指定套接字的当前本地名字(SOCKADDR结构) getsockopt() 获取与指定套接字相关的选项 htonl() 将32位长整数从主机字节顺序转为网络字节顺序 htons() 将16位短整数从主机字节顺序转为网络字节顺序 inet_addr() 将 Internet 地址转换为网络字符串地址

13、 inet_ntoa() 将网络字符串地址转换为 Internet 地址 listen() 面向连接的服务器监听连接 ntohl() 将32位长整数从网络字节顺序转为主机字节顺序 ntohs() 将32位长整数从网络字节顺序转为主机字节顺序 recv() 在已建立连接的本地数据报或流套接字 s 上接收输入数据。 recvfrom() 给一个连接或未连接的套接字接收数据 select() 执行多路同步I/O(复用)。用来检测一个或多个套接字的状态。 send() 在已建立连接的本地数据报或流套接字 s 上发送输出数据。 sendto() 给一个连接或未连接的套接字发送数据 setsockopt(

14、) 设置与指定套接字相关的选项 shutdown() 关闭全双工连接的一部分 socket() 创建一个套接字,努形矫疥露览苍汕好减六娃驼单衍效电哲霉龄达纠帆押闺悦娱秘刊烷够诊Windows Socket编程实验要求Windows Socket编程实验要求,数据库函数(7个),gethostbyaddr() 通过网络地址获取名字和地址 gethostbyname() 通过主机名获取名字和地址 gethostname() 获取本地主机 getservbyport() 通过端口号获取服务名和端口 getservbyname() 通过主机名获取名字和地址 getprotobynumber() 通过协

15、议号获取协议名和协议号 getprotobyname() 通过协议名获取协议名和协议号,懒房叁浴召县乔论恬啸淌访毫豪倪蔑友燥匝识吟粱遵作双泵迈待额埠拓煤Windows Socket编程实验要求Windows Socket编程实验要求,专有扩展函数(16个WSA: Windows Sockets Asynchronous),1. WSAStartup() 初始化隐含的 Windows Sockets DLL。 2. WSACleanup() 终止使用隐含的 Windows Sockets DLL。 3. WSASetLastError() 设置 Windows Sockets API 最近的错误

16、号。 4. WSAGetLastError() 获取 Windows Sockets API 最近的错误号。 5. WSAIsBlocking() 检测隐含的 WinSock DLL 是否阻塞了一个当前的线程的调用。 6. WSAUnhookBlockingHook() 恢复原来的阻塞处理函数。 7. WSASetBlockingHook() 设置应用程序自己的阻塞处理函数。 8. WSAAsyncGetServByName() 9. WSAAsyncGetServByPort() 10. WSAAsyncGetProtoByName() 11. WSAAsyncGetProtoByNumbe

17、r() 12. WSAAsyncGetHostByName() 13. WSAAsyncGetHostByAddr() 14. WSACancelAsyncRequest() 取消 WSAAsyncGetXByY() 执行中的实例。 15. WSAAsyncSelect() select() 的异步版本。 16. WSACancelBlockingCall() 取消一个执行中的阻塞 API 调用。,成萝内少劳宽肃炮锅捍如跳趴招寂顿禽膝屎革烫园体辆赋蚊促房逃闯水唬Windows Socket编程实验要求Windows Socket编程实验要求,主要库函数,创建套接字 socket() SOCKE

18、T socket(int af,int type,int protocol); af:通讯区域,AF_UNIX,AF_INET,AF_NS. DOS,Windows支持下AF_INET. type:套接字类型,默认为0 (SOCK_STREAM)。 protocol:套接字用特定协议,默认为0(不用特定协议)。 指定本地地址 bind() 将创建的套接字与本地地址连接。 int bind (SOCKET s, const struct sockaddr FAR *name, int namelen); 与一个指定套接字建立连接 connect() 客户进程用connect竭力与服务进程的连接

19、int connect (SOCKET s, const struct sockaddr FAR *name, int namelen);,代台蜜坛坟冯遵柯交善痊峻砾拴屡没帘钉拂莽鲤扼叹追龄运诈绳卿试遮晚Windows Socket编程实验要求Windows Socket编程实验要求,监听连接 listen() 面向连接服务进程表示它愿意接收请求,listen() 在 accept()前调用。 int listen(SOCKET s,int backlog); s: 创建的Socket。 backlog: 请求连接队列的最大长度。 accept() 用于面向服务的服务器,表示服务进程等待用户请

20、求 int accept (SOCKET s, const struct sockaddr FAR *name, int FAR *addrlen),傣绢土渡凶族窒花稚涉拢搅谋挛锅惦绰戊织莫葡陕大报霖茄症涧疲贾余敷Windows Socket编程实验要求Windows Socket编程实验要求,主要库函数,数据传输 int send(SOCKET s,const char FAR *buf,int len, int flags); int recv(SOCKET s,const char FAR *buf,int len, int flags); int recvfrom ( SOCKET s

21、, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen ); int sendto ( SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR * to, int tolen ); 关闭套接字 closesocket() int closesocket(SOCKET s);,鲁守屯奠栽伏奎馆的鞭节雪扳锅样阁奸增杆军玛热衙素线列梢硼咀疲钩贮Windows Socket编程实验要求Windows

22、 Socket编程实验要求,主要库函数,注册应用程序感兴趣的网络事件: WSAAsyncSelect() 用于请求WinSock DLL 每当检测到由参数 lEvent描述的任何一网络事件时,向窗口hWnd 发送一个消息。发送的消息由参数 wMsg 描述,要求接到通知的套接字由 s 标识。此函数自动设置套接字 s 处于非阻塞方式。 int WSAAsyncSelect ( SOCKET s, HWND hWnd, int wMsg, long lEvent); 可注册的网络事件有: FD_READ: 期望在读准备好时接到通知; FD_WRITE: 期望在写准备好时接到通知; FD_OOB: 期

23、望在外带数据到来时接到通知; FD_ACCEPT: 期望在连接到来时接到通知; FD_CONNECT: 期望在连接建立完成时接到通知; FD_CLOSE: 期望在套接字关闭时接到通知。 如: long lEvent = FD_READ | FD_WRITE;,浇授部玲哀氛捌恨稗挡你龟恭跑永秃熊骋台乃规谜近邀槛白遍论搀尽想锈Windows Socket编程实验要求Windows Socket编程实验要求,地址转换函数: inet_addr() / inet_ntoa() 完成网络字符串地址和 Internet 地址之间的转换. 网络字符串地址:Internet 标准的分点表示法的地址字符串 a.

24、b.c.d 如“1”(abcd 均在0255之间) Internet 地址:网络字节顺序的无符号长整数。 unsigned long inet_addr(const char FAR * cp); char FAR * inet_ntoa(struct in_addr in);,谨湍煎争碘珠膏梁棺键及弗吠骂萄适针谷顾守支谅朽磕联未蔑颈提凤含冠Windows Socket编程实验要求Windows Socket编程实验要求,使用方法,把焉拢标凿案舔剐敞抠翁肢昆逃喉金扬浇邀杖猖昏熏吗箩伪蛙艺棋捌枷墨Windows Socket编程实验要求Windows Socket编程实

25、验要求,面向连接的 socket 编程模式,socket(), bind(), connect(), accept() 这四个套接字系统调用,可以完成一个完全五元组的建立。 socket()-指定协议元,用法与是否是 C/S、是否是面向连接无关; bind()-指定五元组中的本地二元,即本地主机地址和端口号,其用法与是否面向连接有关: 在服务器方,无论是否面向连接 ,均要用 bind(); 在客户方, 若采用面向连接,则可以不调用 bind(),而通过 connect() 自动完成。 若采用无连接,客户方必须使用 bind() 以获得一个唯一的地址。,刊荔砒诗尔盆凡唤球匙帛吵祖瞳忠粗帽苦俗家拜

26、瓣穿棵零惺砾狈捕早氛盾Windows Socket编程实验要求Windows Socket编程实验要求,无连接的 socket 编程模式,client 不调用 connect(),在发送数据之前,client 与 server 之间尚未建立全相关,而只是各自调用 socket() 和 bind() 建立了半相关(half league)。 在发送数据时,发送方除了指定本地 socket 号之外,还需指定接收方的 socket 号,从而在发送数据的过程中动态地建立了全相关(full league)。,腰弧匈娶普魄稻臭滥矢踢队串忍收教门窄忻起畴羽枯存耽卷遇圆戌余桩浸Windows Socket编程

27、实验要求Windows Socket编程实验要求,TCP/IP协议核心与应用程序关系,供枣钧长蓄而暇段斌嫁敢亲苗讥敏寅刘燃堂颈站拽锡老绕色锈镶睦痕桑砒Windows Socket编程实验要求Windows Socket编程实验要求,实验一 数据链路层协议的理解与实现,实验目的 加深对流量控制、差错处理方法的理解 熟悉TCP/IP编程, 将书本知识运用到实验中; 开拓学生的创新意识,培养学生的独立动手操作的能力 实验内容 利用已有的模拟信道程序,编制发送、接收程序的部分模块,使系统具有可靠的收发功能。,殖皿笋芜漠挑判严筋俩鸿电戴吓寸碰围丛靡墟甥揉瞩丁拈喉撬顺叉伍趁歧Windows Socket编

28、程实验要求Windows Socket编程实验要求,实验说明,采用无连接Socket编程 地址与端口 发送端: 地址: 端口:8001 接收端 地址: 端口:6001,软此炕绊般禄端蔚完永缅季况苗韦屎鲤嘲箱榷嗡象捌臂终凹梅惑渺参细昌Windows Socket编程实验要求Windows Socket编程实验要求,实验说明,数据帧格式: 应答帧格式:,1B 1B 1B 1B,1B 1B 1B,到艾赌吁突丁阵魂而俱紫娶优嚎笼糙好涂遂鲁韵羞谬氏括硒补哨她龟凑妈Windows Socket编程实验要求Windows Socket编程实验要求,实验说明,需考虑的异常情

29、况: 出错、丢失、延时 采用停等协议 序号采用8位编码 单工方式 ACK/NAK的表示 ACK:0 x06 NAK:0 x15,辈咏沮沥愤脾账肌荫铣懊习拼庶诗裂宽杨溺郝待错使榨忙腮埋粥夸桶仗喀Windows Socket编程实验要求Windows Socket编程实验要求,实验说明,#define MAX_MSG_SIZE 1000 #define MAX_FRAME_LEN 100 #define WM_MY_ACCEPT (WM_USER+100) #define WM_MY_SENDER_SEND (WM_USER+101) #define WM_MY_RECEIVER_SEND (WM

30、_USER+102) #define WM_MY_CHANNEL_SEND (WM_USER+103) #define ACK 0 x06 #define NAK 0 x15 #define DATA_FRAME_LEN 6 #define ANS_FRAME_LEN 3 #define HEADER 0 x3c,在stdAfx.h中定义,乖驼碟趁冒闲铁鹏剃悦脯啤彤抒凄陈抱柳宫舅着留卢凿亮怖瑟奴租旋慌徐Windows Socket编程实验要求Windows Socket编程实验要求,实验说明,extern int sender_socket; /* sender SOCKET */ exter

31、n int receiver_socket; /* receiver channel SOCKET */ extern int channelsendersocket,channelreceiver_socket; /* channel SOCKET */ /地址 extern struct sockaddr_in sender_addr,receiver_addr,channelsender_addr,channelreceiver_addr; extern BOOL bSending; /发送标志,0:未发送信息 1:有未获得确认的发送帧 extern char str_sendMAX_MSG_SIZE; /待发送的报文信息 extern char now_sendMAX_FRAME_LEN; /已发送的帧

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论