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前言 这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器 ...
最新文章
- C语言输入3298运行结果为,浙江农林大C语言程序设计习题集答.doc
- Nginx Kafka数据生产接口
- 实际应用中git(合并本地与服务器项目)
- [做题记录]AtCoder AGC做题记录
- linux 内核dmesg,linux內核調試kmsg,dmesg
- rsync+inotify远程同步
- 2021年本溪高考成绩查询,2021年本溪高考状元名单公布 今年本溪高考状元是谁资料和分数...
- 使用docker搭建redis主从
- REDO LOG大小引起的Oracle数据库性能下降
- .html文件可以删掉吗,packages文件夹可以删除吗?
- 8g ubuntu 树莓派4b_树莓派4B如何安装ubuntu20.04
- 十二个月内 仅仅依靠Google打造成功网站
- BZOJ 2588: Spoj 10628. Count on a tree( LCA + 主席树 )
- 拓端tecdat|R语言资产配置: 季度战术资产配置策略研究
- 智能家居,“智能”是前提,“安全”是根本
- 0x0000005c蓝屏问题解决
- 三星香港 android8.0,三星On7官方港版安卓8.0固件rom线刷包:TGY-G6100ZHU3CSG1
- elasticsearch索引health 健康状态变为yellow,red处理
- 通过实例彻底理解闭包
- 结合本科C++项目的MFC学习总结
热门文章
- 我就想要个两年1024徽章~!
- 【Java Web前端开发】JavaScript基础
- python【蓝桥杯vip练习题库】ADV-288成绩排名
- 基类成员的public访问权限在派生类中变为_C++ 派生类的构造函数(学习笔记:第7章 06)...
- 传统网站与营销型网站区别盘比
- 如何操作提升手机端网站的排名优化?
- 网站文章中如何设置关键词才更有利于SEO优化?
- 网页页面设计如何做到极致舒适感?
- sphinx.conf listen = 9306:mysql41_Sphinx 安装与使用
- tomcat使用php+mac_Mac环境下配置tomcat