gpt4 book ai didi

linux - 传出 TCP 端口匹配监听端口

转载 作者:可可西里 更新时间:2023-11-01 02:43:09 26 4
gpt4 key购买 nike

我遇到了一个奇怪的偶然事件,我的结果

lsof | grep 40006

制作

java      29722     appsrv   54u     IPv6           71135755        0t0      TCP localhost:40006->localhost:40006 (ESTABLISHED)

一般我看

java      30916     appsrv   57u     IPv6           71143812        0t0      TCP localhost:43017->localhost:40006 (ESTABLISHED)

箭头两侧的端口不匹配。虽然 lsof 产生了前一个结果,但我无法启动尝试监听端口 40006 的应用程序,即使套接字配置为 SO_REUSEADDR。

这会发生吗?应该吗?

uname 给出:Linux femputer 2.6.32-24-server #39-Ubuntu SMP Wed Jul 28 06:21:40 UTC 2010 x86_64 GNU/Linux

最佳答案

可以通过创建套接字来安排这样的连接,将其绑定(bind)到 127.0.0.1:40006,然后使用 connect() 将其绑定(bind)到 127.0。 0.1:40006。 (注意:没有 listen())。我相信这被称为“主动-主动开放”。

下面的程序演示了这一点:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

int main()
{
int s;
struct sockaddr_in sa = {
.sin_family = PF_INET,
.sin_port = htons(40006),
.sin_addr.s_addr = htonl(INADDR_LOOPBACK) };

s = socket(PF_INET, SOCK_STREAM, 0);

if (s < 0) {
perror("socket");
return 1;
}

if (bind(s, (struct sockaddr *)&sa, sizeof sa) < 0) {
perror("bind");
return 1;
}

if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) {
perror("connect");
return 1;
}

pause();

return 0;
}

端口不能被重新使用的原因是因为端口没有监听——它是一个输出端口。

关于linux - 传出 TCP 端口匹配监听端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4393072/

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