gpt4 book ai didi

linux - 使用 bash 查看 tcp 端口是否已绑定(bind)(未监听)

转载 作者:太空宇宙 更新时间:2023-11-04 05:02:16 24 4
gpt4 key购买 nike

我正在尝试确定最近启动的进程绑定(bind)的 TCP 端口是否实际上已被该特定进程使用。

拿这个program.cpp

int daemonport = 11234;

struct sockaddr_in loopback;
memset ((char*) &loopback, 0, sizeof (loopback));
socklen_t len = sizeof (loopback);
loopback.sin_family = AF_INET;
loopback.sin_port = htons (daemonport);
loopback.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
daemonfd = socket (AF_INET, SOCK_STREAM, 0);
if (daemonfd < 0)
{
errx (EXIT_FAILURE, "Critical error");
}
if (bind (daemonfd, (struct sockaddr*) &loopback, sizeof (loopback)) != 0)
{
errx (EXIT_FAILURE, "Daemon already running, TCP port: '%d'", daemonport);
}
if (getsockname (daemonfd, (struct sockaddr*) &loopback, &len) != 0)
{
errx (EXIT_FAILURE, "Critical error");
}
printf ("%d\n", ntohs (loopback.sin_port));

if (daemon (1, 0) < 0)
{
close (daemonfd);
errx (EXIT_FAILURE, "Failed to daemonize!");
}

// event loop...

close (daemonfd);

现在,将 tcp 套接字绑定(bind)(但不监听)到端口 11234,我想使用 bash 脚本检查该端口是否由进程绑定(bind)。

我尝试了各种 netstat 和 lsof 模式,但没有成功:

netstat -a | grep ':11234' 以及 lsof -i :11234

它们都不打印带有绑定(bind)端口的行。

但是当我第二次尝试运行该程序时,它出错了:

Daemon already running, TCP port: '11234'

最佳答案

假设是 Linux,从这里开始:

netstat --inet -n -a -p | grep ':myport'

看看你会得到什么。 --inet 不显示 IP6 和 Unix 域套接字。 -n 显示数字结果,而不是从端口号转换的名称。 -p 告诉您哪个进程正在监听它。

如果其中任何一行处于“LISTEN”状态,则表示该端口上有进程正在监听。但是,任何使用该端口的打开连接(甚至“TIME_WAIT”)都将阻止该端口重新打开,除非您使用 SO_REUSEPORT option每次绑定(bind)它时。

如果该命令没有向您显示任何内容,则表明该端口上没有任何内容正在监听,这意味着您的程序一定有问题。

您正在打印一条错误消息,但假设问题是已经在运行的某些东西。打印出 errno 值(使用 perror(...)),以便您准确了解问题所在。

关于linux - 使用 bash 查看 tcp 端口是否已绑定(bind)(未监听),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29411189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com