如何使用c检查linux中的端口是否可用
我从来没有写过这样的东西, 如何使用c程序检查端口是否为空 在Linux环境中 非常感谢 ps正在寻找一种方法,不使用bind或connect并检查是否失败 编辑如何使用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
我不能使用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