问题模型:

server1为服务端,在本地的9999端口监听,server2相对server1是客户端,server2启动后首先向server1发起连接,然后再8888端口监听。程序代码不在列出。

先后启动server1、server2,然后查看当前连接,如图1所示。

图1.建立连接,正常

之后强制结束server1(ctrl+c),再次查看当前连接状态,如图2所示。

图2.server1主动关闭后的状态

我们发现连接并没有消失(close),这是什么原因呢?

从时序图中可以看出server1终止伴随着FIN分节的发送,server2收到FIN导致进入CLOSE_WAIT状态,同时server2发送FIN分节的ACK,server1收到ACK后进入FIN_WAIT2状态。

注意:虽然进程server1已经终止,但是这条server2到server1的连接并没有终止,因为还没有完成TCP的最后“四次挥手”。

接着强制终止server2(ctrl+c),再次查看端口状态。

终止server2,导致server向server1发送FIN。我们发现这个连接进入了TIME_WAIT状态。

我们再终止server2。

关于什么是TIME_WAIT状态,以及为什么要有TIME_WAIT状态,网上可以很容易查到,这里不再赘述。但要说明的,从图4从可以看出,TIME_WAIT状态是在server1端出现的,也就是整个连接的主动关闭端。

下面开始我们真正的问题,我们重新启动server1,并用server2连接server1。此时,server2向server1发起链接,调用connect会失败。

我们发现连接失败,而从出错的信息(connection refused)可以推断应该是服务端(server1)没有在相应端口(9999)监听。等一段时间过后,在查看端口状态,我们发现TIME_WAIT状态消失了.

server1并没有在9999端口监听,而我们的server1确的的确确的在运行。

这是什么原因?其实看似server1在运行,其实bind时已经出错,只是程序没有将出错信息打印出来。在server1添加如下代码:

n=bind(listenfd, (sockaddr *) &serveraddr, sizeof(serveraddr));

if(n!=0)

{

perror(“bind error:”);

}

再次启动server1(此时server1之前的连接仍处于TIME_WAIT状态)。

造成这个错误的原因是之前的连接还并没有消失(处于TIME_WAIT),而server1又试图bind一个现有连接(处于TIME_WAIT的连接)上的端口(9999),所以bind失败。Server2当然也就不能连接成功了。那么如何使服务端(server1)主动关闭后可以立即重启呢?

解决方法:在bind设置SO_REUSEADDR套接字选项。

const int on=1;

setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));

之后再次重复上述重启操作,重启成功。

l SO_REUSEADDR选项

SO_REUSEADDR选项的用途有多中,我们只讨论这里使用到的功能。先来看看UNP V1对这种情况的描述。

SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将该端口用作它们的本地的连接仍存在。这个条件通常是这样碰到的:

(1) 启动一个监听服务器;

(2) 连接请求到达,派生一个子进程来处理这个客户;

(3) 监听服务器终止,但子进程继续为现有连接上的客户提供服务;

(4) 重启监听服务器。

默认情况下,当监听服务器在步骤(4)中通过调用socket、bind和listen重新启动时,由于它试图捆绑一个现有连接(即正由早先派生的那个子进程处理着的连接)上的端口,从而bind调用会失败。但如果该服务器在socket和bind中间调用设置了SO_REUSEADDR选项,那么bind将成功。 ——以上摘自UNP V1

下面对比我们这里遇到的情况,server1主动关闭后进入TIME_WAIT状态,此时对server1来说原有连接没有彻底终止,当重启server1时,就试图bind一个现有的连接,所以造成bind失败。所以一般TCP服务端都要设置SO_REUSEADDR选项,以便可以快速重启。

linux上运行tcpserver没反应,linux网络编程/tcp_server中server bind失败原因的调研相关推荐

  1. linux java jar打包_【Java】Java程序打包成jar包在Linux上运行

    当需要把在Windows上开发的Java程序用在Linux上运行时,就需要吧该Java程序打包成jar包上传到Linux上去运行. 1.Java程序用MyEclipse打包成可运行的jar包 (1)在 ...

  2. c#如何在linux上运行程序,在Linux上运行C#

    众所周知,C#是Microsoft推出的.NET语言,只能在.NET平台上运行,例如Win 9x.ME.NT.2000.XP和Win CE之类的操作系统.但是,现在却有了一个叫做Mono的项目,它的目 ...

  3. linux 命令行 webcamera,如何在Linux上运行网络摄像头(Run a Webcam on Linux)?

    在Linux上安装.配置和运行网络摄像头可以是一个相当简单的过程,也可以是一个相当复杂的过程.有许多步骤可以帮助顺利安装,每个网络摄像头和计算机设置都会有自己的怪癖和潜在的问题.用最简单的形式,要在L ...

  4. linux下运行python unitest_Python unittest打印日志可以在Linux上运行,但在Windows上不行...

    我正在尝试编写一个unittest,它将stdout和stderr重定向到一个写在Windows网络驱动器上的文件.出于某些原因,相同的脚本(只有diff.是目录路径)可以在Linux上工作,但在Wi ...

  5. linux上运行项目,发布项目到 Linux 上运行 Core 项目

    目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win7)上用虚拟机建了个 CentOS7 ,来演示下,我们windows上的项目如何发布项目到Linux上运行 ...

  6. 在linux上运行python脚本(安装pytorch踩坑记录,pyinstaller使用方式,构建docker镜像)

    背景 脚本需要导入pytorch等库才能运行. 脚本在windows上运行成功,尝试放到linux上运行. linux服务器内存较小. 方法一:在linux上安装依赖 把脚本放到linux上,直接安装 ...

  7. linux系统运行flash3d,在Linux上运行STM32,快来试试!

    原标题:在Linux上运行STM32,快来试试! STM32MP1多核微处理器,带有650Mhz主频的cortex-A7双核以及一个主频为209Mhz的cortex-M4核,即片内拥有三核.很多STM ...

  8. 中国菜刀能在linux上运行吗,【Web Shell】- 技术剖析中国菜刀

    在第一部分,简单描述了中国菜刀的基本功能.本文我将剖析中国菜刀的平台多功能性.传输机制.交互模式和检测.我希望通过我的讲解,您能够根据您的环境检测出并清除它. 平台 那么中国菜刀可以在哪些平台上运行? ...

  9. window应用在linux运行,如何在Linux上运行Windows应用程序?

    原标题:如何在Linux上运行Windows应用程序? 一些人可能避免在Linux上运行Windows应用程序,但事实上有时候这么做大有帮助. 一些人无法摆脱Windows的最主要原因之一是可用的应用 ...

  10. 如何在虚拟机linux下运行程序吗,如何在Linux上运行Windows应用程序?

    一些人可能避免在Linux上运行Windows应用程序,但事实上有时候这么做大有帮助. 一些人无法摆脱Windows的最主要原因之一是可用的应用程序.有时候,这些应用程序是老式应用程序,没有开源替代版 ...

最新文章

  1. linux 编译c_含有CGO代码的项目如何实现跨平台编译
  2. AI专家Marcus质疑深度学习:面临十大挑战(含参考文献)
  3. IBM Rational AppScan使用详细说明
  4. JAVA控件属性列表_Gradle获取项目属性列表
  5. [翻译] 聚集索引表 VS 堆表
  6. 迈入JavaWeb第一步,Java网络编程基础,TCP网络编程URL网络编程等
  7. 在linux下利用ls命令进行模糊查找
  8. [css] 在sass中可以执行布尔运算吗?
  9. 1.Python基础----认识环境
  10. 一、bootstrap table 初体验
  11. rrpp协议如何修改_RRPP协议做为高级网络工程师不能不懂的技术带你快速学习
  12. 计算机社团招新个人简历,大学社团招新面试自我介绍五篇
  13. 血的教训!千万别在生产使用这些 redis 指令
  14. WINDOWS补丁不装更好
  15. vue-cli3安装遇到的问题,卸载不掉旧版本,导致更新不了
  16. 电子游戏发展史话——《doom启示录》读后感(三)
  17. win10开始菜单添加磁贴_IT之家学院:Win10 自定义开始菜单磁贴背景颜色及图标...
  18. 2020抖音无人直播技术:最新不封号无人直播的操作方法详细介绍
  19. PCB板设计后期处理流程及工作步骤有哪些?2021-07-29
  20. 组合数怎么用计算机算方差,投资组合的方差公式是什么?怎么算的

热门文章

  1. Ubuntu18.04 安装 Mysql 5.7 问题
  2. 一次小黄车的二维码还原过程
  3. 现代软件工程第五周作业
  4. Google位置服务模板
  5. OSI七层模型设计思路
  6. CICD详解(十一)——sonar详解
  7. Tomcat详解(六)——Tomcat运行模式调优
  8. linux挂载与卸载图文解析
  9. Spring Boot (一)快速入门
  10. android调用系统的自定义裁剪后得到的图片不清晰,使用MediaStore.EXTRA_OUTPUT获取缓存下的清晰图片...