0

在进一步阅读之前,以下内容仅适用于运行嵌入式 Linux 和经过大量修改的内核的 MMUless (cortex-m*) 部件。

我有一个非常具体的理由*问这个问题,但我认为这个问题一般来说更有趣:

0)这必然适用于我正在编写的特定服务,尽管任何扩展或抽象都会很有趣。

1)假设我是一个进程的实例化,并且我知道可能存在与我相同的进程的先前或未来实例化。我收到了一个唯一的** 参数,它告诉我我正在实例化i,其中i被限制为一组 [0 - ( N -1)] ,总共有N个可能的实例化。基于i,我能够向配置服务注册并请求有关 I(第i个实例化)必须如何表现的当前参数。此外,我使用i确定性地创建一个 TCP 端口,以及其他与此处无关的参数,我必须绑定到该端口。

所以,问题是只知道我想要的 TCP 端口(来自我的论点** i,无论是否相关),我怎么知道是否有任何其他进程绑定到同一个 TCP 端口?

当然可以处理失败的绑定,但是对于我的应用程序......以及一般的问题,在尝试绑定之前,对于已经绑定的端口,C 中最有效的测试是什么?或者更好地说,我想知道绑定是否会失败,而不是尝试绑定并处理失败。

*我正在使用某个库***和 nommu uC,当两个进程尝试绑定到同一个传输协议上的同一个端口时,这会导致所有的地狱——我不知道为什么,我没有时间弄清楚.

**我相信很少会出现某些情况,在这种情况下,两个实例可能会使用相同的参数异步生成,而该参数应该提供唯一和排他的标识;给定流程和系统架构,此流程的每个实例必须是连续的,因此是唯一的。如果启动具有相同参数的两个实例化,则一个实例必须以最少且受进程限制的逻辑和操作而死。

***我正在使用 uCLibc,但我提到的库有点晦涩难懂。

4

2 回答 2

1

只知道我想要的 TCP 端口(来自我的论点** i,无论是否相关),我怎么知道是否有任何其他进程绑定到同一个 TCP 端口?

只是(尝试)connect()它。

于 2015-12-12T09:09:41.460 回答
1

您可以解析 /proc/net/tcp 并查看端口是否正在使用中。这里有每个字段的详细说明:https ://www.kernel.org/doc/Documentation/networking/proc_net_tcp.txt

挖掘了一下,我发现可以在 Linux 中使用 TCP/IP 堆栈的功能,即那些用于生成 /proc/net/tcp 的功能。这是一个内核模块 ( knetstat ) 项目的链接,它以人类可读的形式提供有关 TCP 套接字的信息。我知道这种方法可能无法集成到您的应用程序中,但是,这些信息可能有助于更好地理解问题。

于 2015-12-12T10:31:50.337 回答