首页 > 其他分享 >TCP端口重用[转]

TCP端口重用[转]

时间:2023-06-18 14:04:18浏览次数:37  
标签:bind 端口 重用 TCP 地址 接字 servaddr



 

在以前的文章中,我曾经引用过一篇端口重用与端口独占程序设计。但是,后来我发现其中有一点写的不清楚,为清视听,善意为作者添加一点. setsockopt()中的第四个参数是端口重用与否的标志,为1则可重用,否则,禁止重用。所以,上面那篇文章应该加一句:cflag=1;


隐患 3.地址使用错误(EADDRINUSE)

您 可以使用 bind API 函数来绑定一个地址(一个接口和一个端口)到一个套接字端点。可以在服务器设置中使用这个函数,以便限制可能有连接到来的接口。也可以在客户端设置中使用 这个函数,以便限制应当供出去的连接所使用的接口。bind 最常见的用法是关联端口号和服务器,并使用通配符地址(INADDR_ANY),它允许任何接口为到来的连接所使用。

bind 普遍遭遇的问题是试图绑定一个已经在使用的端口。该隐患是也许没有活动的套接字存在,但仍然禁止绑定端口(bind 返回 EADDRINUSE),它由 TCP 套接字状态 TIME_WAIT 引起。该状态在套接字关闭后约保留 2 到 4 分钟。在 TIME_WAIT 状态退出之后,套接字被删除,该地址才能被重新绑定而不出问题。

等待 TIME_WAIT 结束可能是令人恼火的一件事,特别是如果您正在开发一个套接字服务器,就需要停止服务器来做一些改动,然后重启。幸运的是,有方法可以避开 TIME_WAIT 状态。可以给套接字应用 SO_REUSEADDR 套接字选项,以便端口可以马上重用。

考虑清单 3 的例子。在绑定地址之前,我以 SO_REUSEADDR 选项调用 setsockopt。为了允许地址重用,我设置整型参数(on)为 1 (不然,可以设为 0 来禁止地址重用)。


清单 3.使用 SO_REUSEADDR 套接字选项避免地址使用错误

int sock, ret, on; 
 struct sockaddr_in servaddr; 

 /* Create a new stream (TCP) socket */ 
 sock = socket( AF_INET, SOCK_STREAM, 0 ): 

 /* Enable address reuse */ 
 on = 1; 
 ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ); 

 /* Allow connections to port 8080 from any available interface */ 
 memset( &servaddr, 0, sizeof(servaddr) ); 
 servaddr.sin_family = AF_INET; 
 servaddr.sin_addr.s_addr = htonl( INADDR_ANY ); 
 servaddr.sin_port = htons( 45000 ); 

 /* Bind to the address (interface/port) */ 
 ret = bind( sock, (struct sockaddr *)&servaddr, sizeof(servaddr) );




在应用了 SO_REUSEADDR 选项之后,bind API 函数将允许地址的立即重用。

标签:bind,端口,重用,TCP,地址,接字,servaddr
From: https://blog.51cto.com/maray/6508342

相关文章

  • go语言tcp编程学习
    TCP编程1、网络编程分类包括TCPsocket编程(底层基于tcp/ip协议)和b/s结构的http编程(使用的是http协议,但是底层是tcpsocket实现的)资料:尚硅谷的TCP资料(3卷),可以咸鱼找下资料看下2TCPsocket编程windows查看端口密码:netstat-anb;netstat-an服务器端的处理流程监听端口;接受......
  • frp配置多端口内网穿透?frp多端口怎么配置?
    FRP内网穿透应用场景:本地Web服务外网访问、本地开发微信、本地联调支付宝\微信支付、TCP/UDP端口转发在本机开发好的网站想让客户测试不在需要上传到服务器上面,使用FRP内外网穿透轻松解决;微信开发也不需要在上传到服务器,使用免费FRP内网穿透服务器帮您解决80端口问题,实现微信服务器......
  • 【技术学习】网络学习--简单tcp服务器
    这是一个用AI生成的简单的tcp服务器代码,我稍微改动了一下命名啥的。可以看到代码非常简短,不过却没什么问题,人工智能还是很强的。#include<iostream>#include<sys/socket.h>#include<netinet/in.h>#include<cstring>#include<unistd.h>#defineMAXLNE4096intmai......
  • nginx反向代理实现不同域名映射到同一台服务器的相同端口
    在实际应用中,我们经常会遇到多个域名需要映射到同一台服务器的相同端口的情况,这时可以使用nginx反向代理来实现。以实现将www.example.com和www.test.com都映射到127.0.0.1的80端口为例,具体步骤如下:修改hosts文件在本地hosts文件中添加以下两行:127.0.0.1www.example.com127.0.0.1......
  • 使用tcpdump+wirkshark分析nginx反向代理无法访问问题
    问题描述在使用nginx配置多路径反向代理后端prometheus应用的时候由于prometheus本身是自动跳转到/graph才能正常访问,而使用nginx反向代理如果只是配置简单的http_proxy到后端prometheus的端口会报404错误,以下是具体的配置和报错:location/prometheus{proxy_p......
  • 80端口被占用怎么办(以phpstudy为例)
    netstat-anonetshhttpshowservicestate这里主要看 进程ID,根据ID去任务管理器中找对应的PID进程,该结束的结束,该停的停 ......
  • c#中tcp异步
    usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Net.Sockets;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;n......
  • Docker容器添加映射端口
    一般在运行容器时,都会通过-p来指定宿主机和容器端口的映射,例如:dockerrun-itd-p本地端口:容器内端口所用镜像名参数说明-d表示后台运行容器-t为docker分配一个伪终端并绑定到容器的标准输入上-i是让容器的标准输入保持打开状态-p指定映射端口即创建容器时,可以设置一个......
  • 服务器22端口没有对外开放,那使用ping命令还能通吗
       `ping`命令是基于ICMP协议的网络诊断工具,主要用于测试网络通信是否正常以及测量数据包往返时间等。它并不依赖于任何端口开放与否的情况,因此即使你的服务器的22端口没有对外开放,使用`ping`命令一样可以进行网络通信测试。当你使用`ping`命令测试某个服务器时,它会发......
  • 同步盘换端10080和10081端口
    common.ini中添加ShareWebWindowsServerPort=10090ShareWebWindowsClientPort=10091[Global]loginmode=0autorun=1clearcache=0syncingtips=0cachepath=lastserver=b4cc451bdac94e731ed35882797f371ehideselectdirpage=0shellIconNeedRename=0RegNameLocalSync="......