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编程小结(续)相关推荐

  1. Socket编程小结

    目录: 什么是 socket?... 1 Internet 套接字的两种类型... 1 网络理论... 2 结构体... 2 本机转换... 3 IP 地址和如何处理它们... 4 socket()函 ...

  2. C# Socket编程(5)使用TCP Socket

    TCP 协议(Transmission Control Protocol,传输控制协议)是TCP/IP体系中面向连接(connection oriented)的传输层(transport layer) ...

  3. python 图形化socket编程_Python黑帽编程2.8 套接字编程

    Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...

  4. 转Go语言TCP Socket编程

    授权转载: Tony Bai 原文连接: https://tonybai.com/2015/11/17/tcp-programming-in-golang/ Golang的主要 设计目标之一就是面向大 ...

  5. golang TCP Socket编程

    Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分.在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均 ...

  6. Go语言TCP Socket编程

    2019独角兽企业重金招聘Python工程师标准>>> Go语言TCP Socket编程 Golang的 主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不 ...

  7. go socket编程(详细)

    Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分.在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均 ...

  8. Qt中采用多线程实现Socket编程

    Qt中采用多线程实现Socket编程 Socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 本文介绍的是Qt中采用多线程 ...

  9. 码农翻身讲网络3:从Socket编程到HTTP服务器

    小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?(HTTP请求) 原创: 老刘 码农翻身 1月2日 1前言 这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器 ...

最新文章

  1. C语言输入3298运行结果为,浙江农林大C语言程序设计习题集答.doc
  2. Nginx Kafka数据生产接口
  3. 实际应用中git(合并本地与服务器项目)
  4. [做题记录]AtCoder AGC做题记录
  5. linux 内核dmesg,linux內核調試kmsg,dmesg
  6. rsync+inotify远程同步
  7. 2021年本溪高考成绩查询,2021年本溪高考状元名单公布 今年本溪高考状元是谁资料和分数...
  8. 使用docker搭建redis主从
  9. REDO LOG大小引起的Oracle数据库性能下降
  10. .html文件可以删掉吗,packages文件夹可以删除吗?
  11. 8g ubuntu 树莓派4b_树莓派4B如何安装ubuntu20.04
  12. 十二个月内 仅仅依靠Google打造成功网站
  13. BZOJ 2588: Spoj 10628. Count on a tree( LCA + 主席树 )
  14. 拓端tecdat|R语言资产配置: 季度战术资产配置策略研究
  15. 智能家居,“智能”是前提,“安全”是根本
  16. 0x0000005c蓝屏问题解决
  17. 三星香港 android8.0,三星On7官方港版安卓8.0固件rom线刷包:TGY-G6100ZHU3CSG1
  18. elasticsearch索引health 健康状态变为yellow,red处理
  19. 通过实例彻底理解闭包
  20. 结合本科C++项目的MFC学习总结

热门文章

  1. 我就想要个两年1024徽章~!
  2. 【Java Web前端开发】JavaScript基础
  3. python【蓝桥杯vip练习题库】ADV-288成绩排名
  4. 基类成员的public访问权限在派生类中变为_C++ 派生类的构造函数(学习笔记:第7章 06)...
  5. 传统网站与营销型网站区别盘比
  6. 如何操作提升手机端网站的排名优化?
  7. 网站文章中如何设置关键词才更有利于SEO优化?
  8. 网页页面设计如何做到极致舒适感?
  9. sphinx.conf listen = 9306:mysql41_Sphinx 安装与使用
  10. tomcat使用php+mac_Mac环境下配置tomcat