- 1、本文档共106页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第3章_Socket编程基础祥解.ppt
* 为了能并发地接收多个客户的服务请求,要激活一个新进程或新线程来处理这个客户请求(如UNIX系统中用fork、exec)。服务完成后,关闭此新进程与客户的通信链路,并终止。 * 什么是并发,与并行的区别 对于多任务操作系统 宏观上并发,若是单核,微观上并行 * 如何将串行程序改为并发或者并行程序 对程序进行阶段划分 * * 主服务器有时又称为父服务器,而从属服务器又称为子服务器。 服务器在同一时间可向多个客户提供服务。 TCP 是面向连接的,因此在服务器和多个客户之间必须建立多条 TCP 连接,而每一条 TCP 连接要在其数据传送完毕后才能释放。 使用 TCP 的服务器只能有一个熟知端口。 因此主服务器在熟知端口等待客户发出的请求。一旦收到客户的请求,就立即创建一个从属服务器,并指明从属服务器使用临时端口和该客户建立 TCP 连接,然后主服务器继续在原来的熟知端口等待向其他客户提供服务。 * * * 引入 套接字 套接字的起源 套接字基本概念 套接字的基本类型 套接字是对网络中不同主机上应用进程之间进行双向通信的端点的抽象,一个套接口就是网络上进程通信的一端,提供了应用层进程利用网络协议栈交换数据的机制。 在Linux中,进程是通过文件描述符(file descriptors,简称fd)而不是文件名来访问文件的,文件描述符实际上是一个整数。Linux中规定每个进程能最多能同时使用NR_OPEN个文件描述符,这个值在fs.h中定义,为1024*1024(2.0版中仅定义为256)。 每个文件都有一个32位的数字来表示下一个读写的字节位置,这个数字叫做文件位置。每次打开一个文件,除非明确要求,否则文件位置都被置为0,即文件的开始处,此后的读或写操作都将从文件的开始处执行,但你可以通过执行系统调用LSEEK(随机存储)对这个文件位置进行修改。Linux中专门用了一个数据结构file来保存打开文件的文件位置,这个结构称为打开的文件描述(open file description)。 * struct WSAData { ? ? WORD wVersion; ? ? WORD wHighVersion; ? ? char szDescription[WSADESCRIPTION_LEN+1]; ? ? char szSystemStatus[WSASYSSTATUS_LEN+1]; ? ? unsigned short iMaxSockets; ? ? unsigned short iMaxUdpDg; ? ? char *lpVendorInfo; }; WSADATA结构被用来保存AfxSocketInit函数返回的Windows Sockets初始化信息。 * * * WINDOWS SOCKET API * * 套接字操作原语 1 基于流式套接字的编程框架 * Sockaddr是通用网络地址结构,实际上并没有直接使用 两者是并列结构 * 发送协议栈和接受协议栈必须多字节字段进行协调,即16位端口和32位IP 具体方式是,将多字节字段按主机字节顺序装入到套接字地址结构中,当需要写到协议头部,将其转换为网络字节顺序,若需要从协议头部读取时,将其转换为主机字节顺序; 有具体函数实现转换 /blog/static/8444235201091054458112/ 参考多字节存放顺序代码 * Bind常见错误:WSAEADDRINUSE 使用U n i c o d e时有一种选择,即把字符串当作c h a r *或把它造型为c h a r *发送。需要 注意的是,在利用字符串长度函数告诉Winsock API函数收发的数据有多少字符时,必须将这 个值乘以2,因为每个字符占用字串组的两个字节。另一种选择是在将字串数据投给Wi n s o c k A P I函数之前,用Wi d e C h a r To M u l t i B y t e把U N I C O D E转换成A S C I I码。 * Listen的调用将套接字状态从closed-listen 关于connect函数的说明:由内核为客户端分配临时端口; 分析connect出错的情况: 所connect失败,套接字不可用,需要closesocket * 流式套接字不能保证对请求的数据量进行读取或写入 两个问题: 发送1024个字节的send,是否立刻把数据发送出去,并且是否能够把所有1024个字节发送出去 * * 1 send recv shutdown 行为 2 关注TCP连接状态的变化 3 实现细节 * htonl( INADDR_ANY); * 收发数据的所有错误码都是SOCKET_ERROR。 一旦返回错误,系统就会调用WSAGetL
文档评论(0)