Socket编程小结(续)
1. 重用已使用的地址
问题描述:在刚刚关闭了测试程序后,再启动服务器时提示bind失败,返回错误EADDRINUSE。
原因分析:套接字(主动关闭一端)在关闭套接字后会停留在TIME_WAIT状态一端时间,由于我在同一机器上同时运行客户端与服务器,故服务器在重新启动执行bind时,可能上次关闭连接还没有完成,连接依然存在,故bind失败。通过设置套接口的SO_REUSEADDR可重用已绑定的地址,通常所有的TCP服务器都应该指定本套接口选项。具体方法为:
int flag = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
2.IO地址复用
直接调用read/write读写套接口和先调用select/poll在调用read/write都属于阻塞IO,只不过前者阻塞在读写系统调用上,而者阻塞在select/poll上。由于select需要两个系统调用,IO复用还稍有劣势,使用select/poll的优势在于我们可以等待多个描述字就绪。
IO复用的编程模型通常为:(以poll为例,应用实例请参考UNP第158页)
1. 创建一个pollfd结构数组,数组长度为进程可能打开的最大描述符个数,可简单的使用OPEN_MAX <limits.h>。
2. 置数组的第一个元素为监听套接字的就绪条件,并将其它的元素都清空。
3. 调用poll,等待poll返回。
4. 对于每一个已就绪的描述字:
l 如果是监听描述字,则调用accept,得到连接描述字,并在pollfd数组第一个空位中加入连接描述字的就绪条件,并将就绪描述字数目减1,当减到0时转到3。
l 如果是连接描述字,则接受来自该描述字的请求信息,并发送响应信息,将该描述字从pollfd数组中移除,并将就绪描述字数目减1,当减到0时转到3。
3. 同一地址启动TCP与UDP服务
1. 创建TCP套接字,并绑定地址。
2. 创建UDP套接字,并绑定地址。
3. 调用select/poll检查TCP、UDP套接字是否就绪。
l 如果TCP套接字可读,则调用accept获取连接套接字,读取并响应请求。
l 如果UDP套接字可读,则直接读取请求,并发送响应。
具体应用实例参见UNP第223页。
转载于:https://www.cnblogs.com/yunnotes/archive/2013/04/19/3032386.html
Socket编程小结(续)相关推荐
- Socket编程小结
目录: 什么是 socket?... 1 Internet 套接字的两种类型... 1 网络理论... 2 结构体... 2 本机转换... 3 IP 地址和如何处理它们... 4 socket()函 ...
- C# Socket编程(5)使用TCP Socket
TCP 协议(Transmission Control Protocol,传输控制协议)是TCP/IP体系中面向连接(connection oriented)的传输层(transport layer) ...
- python 图形化socket编程_Python黑帽编程2.8 套接字编程
Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...
- 转Go语言TCP Socket编程
授权转载: Tony Bai 原文连接: https://tonybai.com/2015/11/17/tcp-programming-in-golang/ Golang的主要 设计目标之一就是面向大 ...
- golang TCP Socket编程
Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分.在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均 ...
- Go语言TCP Socket编程
2019独角兽企业重金招聘Python工程师标准>>> Go语言TCP Socket编程 Golang的 主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不 ...
- go socket编程(详细)
Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分.在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均 ...
- Qt中采用多线程实现Socket编程
Qt中采用多线程实现Socket编程 Socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 本文介绍的是Qt中采用多线程 ...
- 码农翻身讲网络3:从Socket编程到HTTP服务器
小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?(HTTP请求) 原创: 老刘 码农翻身 1月2日 1前言 这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器 ...
最新文章
- 2018-3-20论文(一种新型的智能算法-狼群算法WPA)笔记二(狼群系统分析,算法步骤)
- 慎用Outline ,UGUI Outline实现原理分析
- 从Java集成Active Directory
- 无线网桥的特点及应用方案
- dj电商-项目开发流程
- [算法题] Search in Rotated Sorted Array
- 过滤器链模式PK匿名方法实现,哪个更优雅?
- 进程通信方法的特点以及使用场景
- 如何根据变量类型选择数据分析方法
- emui内核支持kvm吗_Linux专题—使用kvm搭建虚拟机
- MySQL触发器自动更新memcache[转]
- 【Foreign】字符串匹配 [KMP]
- bzoj 4571 美味 —— 主席树
- 人民币转换美金的c语言代码大全,C语言 人民币转换代码
- bzoj1574[Usaco2009 Jan]地震损坏Damage*
- Chrome主页被恶意篡改
- html静态页面图书馆管理,静态页面管理
- 笔记十一:提升高效技术领导的创新能力
- HTTP/2和HTTP/3
- 看过无数总结,经历无数实践,这才是顶级IT公司的架构设计
热门文章
- 借花献佛!docker讲解视频
- python在坐标轴上画矩形_Python使用matplotlib实现在坐标系中画一个矩形的方法
- android 定位 闪退_Android使用百度地图出现闪退及定位时显示蓝屏问题
- 产品网络推广方案之网站SEO优化如何“讨好”用户,降低网站跳出率?
- 网站推广浅析库克八亿年终奖的背后苹果公司如何展开企业的营销推广
- seo优化无法避免却又无可奈何的问题
- python调用大漠插件_Burp Extender Apis 插件开发 (一)
- php 一年中所有的天,PHP获取一年中的每星期的开始日期和结束日期
- 两对光纤收发器用网线连接_光纤那么快,路由器和电脑之间为何不用光纤连接,反而用普通网线...
- java linux 时区_java同步/设置Linux系统时间