网站大量收购独家精品文档,联系QQ:2885784924

05_socket应用编程_专题讲座_v1.0.1(下)-王保明.docxVIP

05_socket应用编程_专题讲座_v1.0.1(下)-王保明.docx

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
05_socket应用编程_专题讲座_v1.0.1(下)-王保明

轻松入门 实战应用 从项目开发角度 为你搭建完整的知识体系 wangbaoming linux Socket-应用编程-专题讲座 written by 王保明 5Socket Api编程进价2 服务器端多进程并发子进程退出问题 TCP回射客户/服务器模型总结 TCP是个流协议 TCP是基于字节流传输的,只维护发送出去多少,确认了多少,没有维护消息与消息之间的边界,因而可能导致粘包问题。 粘包问题解决方法是在应用层维护消息边界。  僵进程与SIGCHLD信号 服务器端避免僵尸进程的方法: 1)通过忽略SIGCHLD信号,解决僵尸进程 signal(SIGCHLD, SIG_IGN) 2)通过wait方法,解决僵尸进程 signal(SIGCHLD, handle_sigchld); wait(NULL)3)通过waitpid方法,解决僵尸进程 signal(SIGCHLD, handle_sigchld); waitpid(-1, NULL, WNOHANG)    6Socket Api 与TCP/IP的11种状态 TCP/IP协议的11种状态 理解0:什么是主动套接字,什么是被动套接字? 理解1:为什么TCP/IP要三次握手,和四次断开? 理解2:客户端状态向前推进过程,服务器端状态向前推进过程 理解3:执行主动关闭的那一端,进入TIME_WAIT状态 理解4:TIME_WAIT 时间是多长2MSL (2倍的最大生命期时间) 原因:(ACK y+1)如果发送失败可以重发。 服务器端处于closed状态,不等于客户端也处于closed状态。。 理解5:图上几种状态,还有一种CLOSING状态 两端同时关闭 将产生closing状态,最后双方都进入TIME_WAIT状态。实验: 关闭服务方子进程,观察TCP/IP状态 关闭客户端,观察TCP/IP状态。 SIGPIPE 如果对方socket已关闭,对等方再发写数据,则会产生SIGPIPE信号 SIGPIPE信号会让进程终止(man 7 signal,阅读SIGPIPE默认ACT) 往一个已经接收FIN的套接中写是允许的,接收到FIN仅仅代表对方不再发送数据。 在收到RST段之后,如果再调用write就会产生SIGPIPE信号,对于这个信号的处理我们通常忽略即可。 signal(SIGPIPE, SIG_IGN); 结论:对SIGPIPE处理方法:1)忽略该信号即可signal(SIGPIPE, SIG_IGN); 2)捕捉。改变默认行为。TCP/IP 的RST段重置 1)服务器端启动、客户端启动 2)服务器端先kill与客户端通讯的子进程,服务器端会给客户端发送FIN分节 此时:只代表服务器端不发送数据了,不能代表客户端不能往套接字中写数据。 3)如果子进程此时写数据给服务器端(解除屏幕阻塞,输入字符aaaa), 将要导致TCP/IP协议重置,产生RST段;产生SIGPIPE信号。。 4)所以,一般情况下,需要我们处理SIGPIPE信号,忽略即可。 close与shutdown区别 close终止了数据传送的两个方向。 shutdown可以有选择的终止某个方向的数据传送或者终止数据传送的两个方向。 shutdown how=1就可以保证对等方接收到一个EOF字符,而不管其他进程是否已经打开了套接字。而close不能保证,直到套接字引用计数减为0时才发送。也就是说直到所有的进程都关闭了套接字。 思考1 客户端向服务器发送:FIN(close) E D C B A, 问:服务器还能收到数据吗?服务器还可以向客户端回报文吗? 客户端想在关闭之后,仍然能接收到回射服务器应答(shutdown)。 思考2 父进程中close(conn);会不会向客户端发送FIN报文段那? 文件的引用计数-1,当减少为0,才会发送引用计数。 思考3: 客户端//shutdown(sock, SHUT_WR);只关闭了写; 7五种I/O模型 阻塞I/O 说明1:当上层应用app1调用recv系统调用时,如果对等方没有发送数据(缓冲区没有数据),上层应用app1将阻塞(默认行为,被linux内核阻塞); 说明2:当对等方发送了数据,linux内核recv端缓冲区,有数据后,内核会把数据copy给用户空间。然后上层应用app1解除阻塞,执行下一步操作。非阻塞I/O 说明1: 上层应用程序app2将套接字设置成非阻塞模式。 说明2: 上层应用程序app2轮询调用recv函数,接受数据。若缓冲区没有数据,上层程序app2不会阻塞,recv返回值为-1

您可能关注的文档

文档评论(0)

cuotian + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档