- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
socket编程实践
socket编程实践
1.connect函数响应中断返回后仍然回到函数的调用。实践证明,对于一个非阻塞的socket,如果在调用connect函数时,如果发生中断,这函数响应中断,但当中断返回时,继续connect函数的调用,直到connect超时失败或接收到错误ICMP包或连接成功
2.accept()
如果侦听进程是非阻塞模式工作,当调用accept()函数接收来自客户端的请求后,返回的socket套接字,默认为阻塞的工作模式。
一、阻塞模型
可能发生阻塞的套接口调用分为四种:
1.输入操作:read、readv、recv、recvfrom和recvmsg函数
2.输出操作:write、writev、send、sendto和sendmsg函数
3.接收外来连接:accept()函数
4.初始化外出的连接:connect()函数
二、I/O模型
1.阻塞I/O
2.非阻塞I/O
3.I/O复用(select函数)
4.信号驱动I/O(SIGIO)
5.异步I/O
三、I/O复用模型的应用场合
1.当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。
2.一个客户同时处理多个套接口
3.如果一个TCP服务器既要处理侦听套接口,又要处理已连接套接口,一般也要用到I/O复用。
4.如果一个服务器既要处理TCP,又要处理UDP,一般也要使用I/O复用。
5.如果一个服务器要处理多个服务或者多个协议(inetd守护进程)。
四、拒绝服务型攻击
服务器某一个时刻阻塞于只处理单个客户,而不能处理其他客户的需求,这就导致了拒绝服务型攻击,可能的解决办法是:(a)使用非阻塞I/O模型;(b)让每个客户由单独的控制线程提供服务(例如,创建子进程或线程来为每个客户提供服务);(c)对I/O操作设置超时。
五、connect()函数
1.阻塞模式
客户端调用connect()函数将激发TCP的三路握手过程,但仅在连接建立成功或出错时才返回。返回的错误可能有以下几种情况:
1.如果TCP客户端没有接收到SYN分节的响应,则返回ETIMEDOUT,阻塞模式的超时时间在75秒(4.4BSD内核)到几分钟之间。
2.如果对客户的SYN的响应时RST,则表明该服务器主机在我们指定的端口上没有进程在等待与之连接(例如服务器进程也许没有启动),这称为硬错,客户一接收到RST,马上就返回错误ECONNREFUSED.
3.如果某客户发出的SYN在中间的路由器上引发了一个目的地不可达ICMP错误,多次尝试发送失败后返回错误号为EHOSTUNREACH或ENETUNREACH.
附加:产生RST的三种情况,一是SYN到达某端口但此端口上没有正在侦听的服务器、二是TCP想取消一个已有连接、三是TCP接收了一个根本不存在的连接上的分节。
2.非阻塞模式
采用非阻塞的工作模式要考虑一下两种情况:
1.如果是连接本机,则调用connect()函数会立刻建立。
2.如果服务器是网络中的用户,则调用connect()函数需要从几个毫秒的局域网到几百毫秒或几秒的广域网。并且函数会立刻返回EINPROCESS错误,但TCP通信的三路握手过程正在进行,所以可以使用select函数来检查这个连接是否建立成功。
源自Berkeley的实现有两条与select函数和非阻塞相关的规则:
1.当连接成功建立时,描述字变成可写。
2.当连接建立出错时,描述字变成即可读又可写。
六、accept()函数
1.阻塞模式
如果在一个阻塞套接口上调用accept()函数,而且没有新的连接,进程会进入睡眠状态。
2.非阻塞模式
如果在一个非阻塞套接口上调用accept()函数,而且没有新的连接,将返回EWOULDBLOCK错误。
3.一种非阻塞模式例子的问题及解决办法
问题描述:在服务器端侦听套接口采用阻塞的方式工作,并且使用select检测是否有已经建立起的连接,如果有则调用accept()函数接收该连接,问题是如果客户端首先调用connect()函数连接服务器后立刻又调用close()函数关闭该连接,而在服务器端,在select()函数返回和调用accept()函数之间,接收到客户端的断开,则会删除该套接口在已连接套接口中的内容,所以服务器将会阻塞在accept()函数,直到有客户连接才返回。
解决办法:(1).如果用select来获知何时有连接已就绪可以accept时,总是把侦听套接口置为非阻塞,同时(2).在后面的accept调用中忽略以下错
原创力文档


文档评论(0)