Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用c检查linux中的端口是否可用_C_Linux - Fatal编程技术网

如何使用c检查linux中的端口是否可用

如何使用c检查linux中的端口是否可用,c,linux,C,Linux,我从来没有写过这样的东西, 如何使用c程序检查端口是否为空 在Linux环境中 非常感谢 ps正在寻找一种方法,不使用bind或connect并检查是否失败 编辑 我不能使用bind或connect,正在寻找一种更快的方法来查找连续可用的3k端口更好的方法是使用下一个可用端口,也可以使用0端口bind将使用下一个可用端口 您可以通过以下代码获得bind()选择的端口 struct sockaddr_in sin; socklen_t len = sizeof(sin); if (getsockn

我从来没有写过这样的东西, 如何使用c程序检查端口是否为空 在Linux环境中 非常感谢

ps正在寻找一种方法,不使用bind或connect并检查是否失败

编辑
我不能使用bind或connect,正在寻找一种更快的方法来查找连续可用的3k端口

更好的方法是使用下一个可用端口,也可以使用0端口bind将使用下一个可用端口

您可以通过以下代码获得bind()选择的端口

struct sockaddr_in sin;
socklen_t len = sizeof(sin);
if (getsockname(sock, (struct sockaddr *)&sin, &len) != -1)
  printf("port number %d\n", ntohs(sin.sin_port)); 

另请参阅以获取更多信息

使用system()或popen()运行以下命令

它将给出您机器的所有已使用端口的列表。 您需要解析该命令的输出,然后您将拥有所有繁忙端口的列表。

直接使用bind()如何,如果不成功,您可以尝试其他端口

您刚刚检查了一个端口是否空闲,但有人已经使用了它,这将是一个竞争条件,因此检查一个端口是否空闲,然后绑定它是不可能的

您也可以阅读
/proc/net/tcp
以获取帮助,但竞争条件仍然可能发生。

我也遇到了同样的问题 问题是您需要只检查一个端口还是多个端口

如果你只需要检查一个或几个使用绑定,如果它工作,那么它是免费的(别忘了释放套接字)

如果你像我一样需要检查许多端口,那么对我有效的就是运行 系统('netstat-tulpn'),并将输出重定向到文件/变量 然后在此信息上搜索“{yourport}”

为我工作

ps
如果像我一样,你需要让它们自由,告诉你的计算机不要在该区域随机分配端口

我认为在解析端口时这样做不合适,可能是端口连接关闭,它变为自由。是的,在这种情况下,这样做没有太多优化。通常我使用检查绑定或连接来检查端口,但OP不希望这样。太好了,我希望它能工作,我用matlab编写了这个程序,因为我不知道我在cHappy中有系统命令来帮助。在Linux机器上的C中,您需要包含stdlib.h才能使用system()。@Mr.32同时
system
很容易被错误使用,从而导致漏洞。例如,如果进程正在使用权限运行,并且忽略了
netstat
的绝对路径(如本回答中所示),则用户可能会将名为
netstat
的恶意可执行文件放置在进程的
路径中,使其使用权限运行。其他问题包括称为可执行文件的netstat的平台相关输出(我想象BSD netstat有一个不同的输出,如果它存在的话)。这里的链接解释了这如何导致竞争条件。请记住端口不是简单的“打开”和“关闭”。它们受接口和协议的约束。您可以让接口
lo
中的一个应用程序打开端口80 TCP,另一个应用程序在同一接口中打开相同的端口,但不打开UDP,和其他两个应用程序做相同的操作,但在接口
eth0
等中。同一端口由多个不同的服务器打开,他们都会对此感到高兴。相关:建议保留一系列连续端口的策略。@VinayShukla,例如,对于许多应用程序,在只有服务在运行且没有用户启动连接的服务器上,这种竞争条件发生的几率非常低,无论是否实际绑定到空闲端口,都值得冒任何风险。OP说,不使用
bind/connect
。我同意,我建议他另一种解决方案,因为上面的问题可能会导致比赛状态
netstat -antu