我在重载生产系统中从localhost打开侦听端口时遇到问题。
有时我的端口44000的一些请求失败了。在那段时间里,我检查了telnet到端口没有响应,我很想知道下面的操作需要在那里。正在侦听端口的应用程序是否无法响应请求,或者内核端或打开文件数量存在问题。
如果有人能解释下打开套接字的操作,我将感激不尽。
让我澄清一下。我有一个java进程,它接受来自12个不同server.requests的状态完全连接是statefull SOAP消息。这项服务运行一年没有这个问题。最近我们面临的一个问题是,有时从源端口无法连接到我的服务器端口44000.正如我检查过的那段时间telnet到服务甚至无法从本地服务器。但所有其他港口的反应都很好。它们都以相同的用户运行,允许打开的文件数量远大于这个(lsof | wc -l)
据我所知,应用程序中有一种机制可以限制从源到450并发会话的连接数量,当我面临最大连接数(但不是所有时间)时,问题可能会出现
我的应用程序供应商不接受此问题来自他的一方并指向os /网络/硬件配置。说实话,我重新启动了网络服务,这个特殊端口立即解决了问题。请问??? ???
答案 0 :(得分:2)
以下是在Linux中设置服务器端TCP套接字所需步骤的快速概述:
socket()
创建一个新套接字并为其分配系统资源(*) bind()
将套接字与地址相关联listen()
导致绑定套接字进入侦听状态accept()
接受收到的传入尝试,并为此连接创建一个新套接字。的(*)强> (在wikipedia上非常清楚地详细解释了这一点。)
(*):这些操作在文件描述符表中分配一个条目,如果它已满,则会失败。但是,大多数应用程序都应该存在问题,除非您处理的并发连接数量为数千(参见C10K problem)。
如果由于此原因或任何其他原因导致呼叫失败,errno
将设置为报告错误情况(例如,如果描述符表已满,则为EMFILE
)。大多数应用程序都会在某处报告错误。
回到您的应用程序,有多种原因可以解释为什么它没有响应。如果没有提供有关您尝试设置的服务类型的更多信息,我们只能猜测。如果可以telnet
一致地尝试测试,并查看服务器是否负担过重。
干杯!
答案 1 :(得分:1)
您的描述留下了解释的空间,但正如我们上面所讨论的,也许您的问题是终止的应用程序正在尝试重用相同的套接字端口,但它仍处于TIME_WAIT
状态。
您可以通过以下方式设置套接字选项以重复使用相同的地址(和端口):
int srv_sock;
int i = 1;
srv_sock = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(srv_sock, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
基本上,你告诉操作系统相同的套接字地址&端口组合可以重复使用,无需等待MSL
(最大段寿命)超时。此超时可能是几分钟。
这不允许在仍在使用时重新使用套接字,它仅适用于TIME_WAIT
状态。但显然,以前的交易数据有一些小的可能性。但是,您可以(并且应该)编写应用程序协议来处理无法理解的数据。
更多信息,例如:http://www.unixguide.net/network/socketfaq/4.5.shtml
答案 2 :(得分:0)
使用sudo启动TCP服务器将解决或(如果要在LAN中连接)编辑防火墙规则的情况。 尝试使用nmap(例如,使用TCP Sync Handshake)或类似方法扫描端口,以查看该端口是否对任何协议打开(也许网络安全中继ping ecc ..以便不显示主机)。如果端口没有响应,请检查程序使用的特权,检查防火墙规则,也许端口已打开,但您无法访问它。
Mh我的意思是..您在谈论企业网络,所以我假设您在LAN环境中,因此您只是尝试使用localhost,但需要它在LAN上工作。 无论如何,如果您只需要打开localhost端口检查特权和路由,请尝试“ tracert”并查看会发生什么,等等...
哦,检查端口是否被更高特权的服务或守护进程使用。
无论如何,我现在看到的是这是2014年的帖子,nb gg不错的编码byebye