linux拒绝从localhost打开监听端口

时间:2014-02-23 10:58:53

标签: linux sockets port response

我在重载生产系统中从localhost打开侦听端口时遇到问题。

有时我的端口44000的一些请求失败了。在那段时间里,我检查了telnet到端口没有响应,我很想知道下面的操作需要在那里。正在侦听端口的应用程序是否无法响应请求,或者内核端或打开文件数量存在问题。

如果有人能解释下打开套接字的操作,我将感激不尽。

让我澄清一下。我有一个java进程,它接受来自12个不同server.requests的状态完全连接是statefull SOAP消息。这项服务运行一年没有这个问题。最近我们面临的一个问题是,有时从源端口无法连接到我的服务器端口44000.正如我检查过的那段时间telnet到服务甚至无法从本地服务器。但所有其他港口的反应都很好。它们都以相同的用户运行,允许打开的文件数量远大于这个(lsof | wc -l)

据我所知,应用程序中有一种机制可以限制从源到450并发会话的连接数量,当我面临最大连接数(但不是所有时间)时,问题可能会出现

我的应用程序供应商不接受此问题来自他的一方并指向os /网络/硬件配置。说实话,我重新启动了网络服务,这个特殊端口立即解决了问题。请问??? ???

3 个答案:

答案 0 :(得分:2)

以下是在Linux中设置服务器端TCP套接字所需步骤的快速概述:

  1. socket()创建一个新套接字并为其分配系统资源(*)
  2. bind()将套接字与地址相关联
  3. listen()导致绑定套接字进入侦听状态
  4. accept()接受收到的传入尝试,并为此连接创建一个新套接字。的(*)
  5. (在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