HttpClient:每个套接字地址(协议/网络地址/端口)通常只允许使用一次

     2023-03-31     147

关键词:

【中文标题】HttpClient:每个套接字地址(协议/网络地址/端口)通常只允许使用一次【英文标题】:HttpClient: Only one usage of each socket address (protocol/network address/port) is normally permitted 【发布时间】:2014-10-17 15:52:08 【问题描述】:
using (var client = new HttpClient())

 client.BaseAddress = new Uri(Url);
 client.DefaultRequestHeaders.Accept.Clear();
 client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));

 using (var task = client.PostAsJsonAsync(Url, body))
 
    if (task.Result.StatusCode != HttpStatusCode.OK)
       throw new Exception(task.Result.ReasonPhrase);
 

不知道为什么我们得到每个套接字地址(协议/网络地址/端口)的唯一一种用法通常是允许的 xx.xxx.xxx.xx:80 错误

System.AggregateException: One or more errors occurred. ---> System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted xx.xx.xx.xx:80
at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
   at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)
   --- End of inner exception stack trace ---
   at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context)
   at System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)
   --- End of inner exception stack trace ---
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)

【问题讨论】:

【参考方案1】:

有问题的错误是WSAEADDRINUSE (10048):

地址已在使用中。 通常,每个套接字仅使用一次 地址(协议/IP 地址/端口)是允许的。如果发生此错误 应用程序尝试将套接字绑定到 IP 地址/端口 已用于现有套接字,或未使用的套接字 正确关闭,或仍在关闭过程中。为了 需要将多个套接字绑定到同一个套接字的服务器应用程序 端口号,考虑使用 setsockopt (SO_REUSEADDR)。客户 应用程序通常根本不需要调用 bind——connect 选择一个 自动使用未使用的端口。当使用通配符地址调用 bind 时 (涉及 ADDR_ANY),WSAEADDRINUSE 错误可能会延迟到 提交具体地址。这可能发生在调用 稍后的另一个函数,包括 connect、listen、WSAConnect 或 WSAJoinLeaf。

这意味着您有多个 HttpClient 对象试图同时将自己绑定到同一个本地 IP/端口,或者另一个应用程序正在使用 HttpClient 也尝试使用的 IP/端口。

更有可能的是,您可能过于频繁地发布 HTTP 请求,并且可能没有完全消耗响应,这将阻止 ASP 池化和重用连接,从而随着时间的推移遇到端口耗尽。

【讨论】:

谢谢。这说得通。我在不同的线程中有多个 HttpClient 实例,一个 HttpClient 实例如何知道另一个线程中的另一个 HttpClient 实例正在使用哪个 ip/port? 再次感谢雷米。现在我明白了为什么会出现这个错误。 来自 Henrik Nielsen:这通常是因为您的临时端口用完了。尝试为所有请求重用相同的 HttpClient 实例 @TonyBao 所以如果 TCP 连接总是在同一个客户端和服务器之间,重用同一个 HttpClient 是否意味着服务器总是看到相同的原始地址和端口? @Dibzmania 这取决于 HttpClient 是否重用相同的 TCP 连接,或者 TCP 连接是否关闭然后新的 TCP 连接使用相同的本地 IP/端口【参考方案2】:

我在尝试向一台服务器发送 200 个请求/秒的负载生成器工具中遇到了同样的问题。

我从每个请求的新 HttpClient 实例转移到一个单例,它确实解决了这个问题。

注意 - 最初我遇到了 2 个请求/秒的瓶颈,但将 DefaultConnectionLimit 设置为 500 解决了它:

ServicePointManager.DefaultConnectionLimit = 500;

【讨论】:

【参考方案3】:

最近在 Windows 2012 R2 环境中运行多年的现有客户端/服务器 Web 服务设置中遇到了这个问题。

这个问题只会在很长一段时间后才会出现。 问题发生在传出客户端连接上,而不是服务器上的侦听套接字。 使用 netstat 我们可以看到有足够多的可用套接字。 重启客户端服务并没有解决问题。 重新启动应用程序池/iis 重置无法解决问题。 重启服务器会在一段时间内解决问题。

在按照帖子和 MS 文章的建议用尽所有检查并结合套接字连接知识后,我们认为这是一个较低级别的代码问题,我们聘请了 Microsoft 支持。

结果是 KB 4338824 存在一个已知问题 https://support.microsoft.com/en-us/help/4338824/windows-81-update-kb4338824

我解释一下.... “应用程序和服务可能会在 closesocket() 调用中挂起,并导致应用程序或服务无法绑定到网络套接字。”

应用了以下补丁并解决了问题。 https://support.microsoft.com/en-us/help/4345424/improvements-and-fixes-windows-8-1-and-server-2012-r2

【讨论】:

【参考方案4】:

以管理员身份运行命令提示符并键入以下命令。 netstat -ano | findstr ":80"

a:显示所有连接和侦听端口。 n:以数字形式显示地址和端口号。 o:显示与每个连接关联的所属进程 ID。

如果您使用不同的端口号,请将 80 替换为适当的端口号。

结果将使用最后一列中的 80 端口号显示进程 ID。 您可以在程序中更改端口号,也可以使用 80 端口号终止进程。

【讨论】:

每个套接字地址(协议/网络地址/端口)通常只允许使用一次?

】每个套接字地址(协议/网络地址/端口)通常只允许使用一次?【英文标题】:Onlyoneusageofeachsocketaddress(protocol/networkaddress/port)isnormallypermitted?【发布时间】:2017-06-0917:24:34【问题描述】:我一直在谷歌上寻找一个严肃的解决方... 查看详情

如何修复错误“每个套接字地址(协议/网络地址/端口)通常只允许使用一次”?

】如何修复错误“每个套接字地址(协议/网络地址/端口)通常只允许使用一次”?【英文标题】:HowdoIfixtheerror"Onlyoneusageofeachsocketaddress(protocol/networkaddress/port)isnormallypermitted"?【发布时间】:2013-01-1706:41:38【问题描述】... 查看详情

MySQL/PHP 错误:[2002] 每个套接字地址(协议/网络地址/端口)通常只允许使用一次

】MySQL/PHP错误:[2002]每个套接字地址(协议/网络地址/端口)通常只允许使用一次【英文标题】:MySQL/PHPError:[2002]Onlyoneusageofeachsocketaddress(protocol/networkaddress/port)isnormallypermitted【发布时间】:2012-05-0606:34:35【问题描述】:我已经... 查看详情

(OS 10048) 每个套接字地址(协议/网络地址/端口)通常只允许使用一次。视窗阿帕奇

】(OS10048)每个套接字地址(协议/网络地址/端口)通常只允许使用一次。视窗阿帕奇【英文标题】:(OS10048)Onlyoneusageofeachsocketaddress(protocol/networkaddress/port)isnormallypermitted.Windowsapache【发布时间】:2019-01-2013:31:39【问题描述】:尝试... 查看详情

WCF:System.Net.SocketException - 每个套接字地址(协议/网络地址/端口)通常只允许使用一次

】WCF:System.Net.SocketException-每个套接字地址(协议/网络地址/端口)通常只允许使用一次【英文标题】:WCF:System.Net.SocketException-Onlyoneusageofeachsocketaddress(protocol/networkaddress/port)isnormallypermitted【发布时间】:2010-11-2306:33:52【问题描... 查看详情

socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次

有两种解决方法,一种是加入try{}catch(){},程序就不会抱错了;一种是在设置好监听SOCKET后,将SOCKET的属性设置为可重复使用地址,如://创建监听SOCKET  socketListen=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//设... 查看详情

socket_bind() : 每个套接字地址(协议/网络地址/端口)通常只允许在 php 中使用一次

】socket_bind():每个套接字地址(协议/网络地址/端口)通常只允许在php中使用一次【英文标题】:socket_bind():Onlyoneusageofeachsocketaddress(protocol/networkaddress/port)isnormallypermittedinphp【发布时间】:2014-09-0105:07:55【问题描述】:我从以下... 查看详情

windowssocketerror:通常每个套接字地址(协议/网络地址/端口)只允许使用一次.(10048)

...。水B半桶水就不要来了装B勿来。Windowssocketerror:通常每个套接字地址(协议/网络地址/端口)只允许使用一次.(10048)是设置错误造成的,解决方法为:1、在写代码的时候会遇到如图所示的错误提示:cannotbindto127.0.0.1:5037:通常每个套... 查看详情

19网络编程(socket套接字编程)(代码片段)

网络模型*A:网络模型TCP/IP协议中的四层分别是应用层、传输层、网络层和链路层,每层分别负责不同的通信功能,接下来针对这四层进行详细地讲解。链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动... 查看详情

网络编程--socket(套接字)

网络编程   网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中 有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后 如何可靠高效的进... 查看详情

《计算机网络原理》网络应用通信基本原理

  一个应用进程可以创建多个套接字与同一个或不同的传输层协议进行接口。  对于一个传输层协议,需要为与其接口的每个套接字分配一个编号,表示该套接字,该编号称为端口号。  通常服务器进程套接紫会分配特定... 查看详情

套接字编程简介(代码片段)

目录1.端口号2.套接字对3.套接字地址结构IPv4套接字地址结构通用套接字地址结构4.字节排序函数5.地址转换函数1.端口号在同一台主机或设备上,可能有多个进程同时在使用TCP或UDP协议,端口号的作用就是区分这些不同的进程,... 查看详情

[解决]通常每个套接字地址只允许使用一次

...在做socket的开发的时候,经常会遇到这个错误:通常每个套接字地址(协议/网络地址/端口)只允许使用一次错误指示很明确:通信端口被占用了,导致通信无法进行。但为什么端口被占用了呢?什么端口被占用了?这里其实有一... 查看详情

socket与系统调用深度分析(代码片段)

...机,也不单是传输层的协议端口。传输层连接的端点叫做套接字(socket)。根据RFC793的定义:端口号拼接到IP地址就构成了套接字。所谓套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,包括主机的IP地址与一... 查看详情

套接字地址结构(代码片段)

  每个协议族都定义了它自己的套接字地址结构。这些结构的名字均以sockaddr_开头,并以对应每个协议地址族的唯一后缀结尾。IPV4套接字地址结构  IPv4地址和TCP或UDP端口号在套接字地址结构中总是以网络字节序来存储。stru... 查看详情

网络是怎样连接的

套接字中记录了用于控制通信操作的各种控制信息,协议栈则需要根据这些信息判断下一步的行动,这就是套接字的作用。协议栈是根据套接字中记录的控制信息来工作的。本地IP地址和远程IP地址都是0.0.0.0,这表示通信还没开... 查看详情

linux网络套接字编程(代码片段)

...源端口号与目的端口号▶UDP与TCP协议▶网络字节序💡套接字(socket)介绍▶概念▶分类▶工作流程💡socket编程▶socket编程接口▶sockaddr结构体🎄sockaddr结构体🎄sockaddr_in结构体🎄in_addr结构体💡sock... 查看详情

套接字是啥?

套接字是什么?套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套... 查看详情