【Windows编程问题!!】C++根据端口号,获取对应的进程PID,但是有的端口怎么也找不到对应进程,WHY??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【Windows编程问题!!】C++根据端口号,获取对应的进程PID,但是有的端口怎么也找不到对应进程,WHY??相关的知识,希望对你有一定的参考价值。

我想抓包的时候,同时找到发送这个数据包的PID。
所以需要一个由端口号得到PID的函数
我试过了两种办法。
一种是csdn上面给的那种函数
一种是用 netstat -ano|findstr “”直接找

但是有的端口怎么也找不到?
为什么?是因为他们是UDP的吗?UDP数据包发送完了以后,进程就退出了,所以找不到了吗?
多谢!!

netstat -ano
这个命令肯定可以得,我建议你使用循环调用netstat -ano命令,写到一个文件中去。
或许是你发送完后才调用,那时候,此端口已经没有在发送数据了。
参考技术A 抓包? hook吧. pid就能很容易获得了. 收发也能控制

如何找到套接字的本地端口号? (Windows C++)

【中文标题】如何找到套接字的本地端口号? (Windows C++)【英文标题】:How to find a socket's local port number? (Windows C++) 【发布时间】:2011-10-03 08:14:44 【问题描述】:

我是 Windows 网络的新手,我正在尝试找出我的套接字绑定到的端口号(C++、Windows 7、Visual Studio 2010 Professional)。它是一个 UDP 套接字,据我了解,使用以下初始设置应将其绑定到随机可用端口/地址:

sockaddr_in local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = 0; //randomly selected port
int result = bind(clientSock, (sockaddr*)&local, sizeof(local));
//result is always 0

就使用此方法而言,它适用于发送数据或将其绑定到特定端口(将 0 替换为所需的端口号)。我需要的是随机绑定它,然后找出它绑定到哪个端口。有什么办法可以做到这一点吗?似乎“本地”结构包含“0.0.0.0”作为 IP 地址和“0”作为端口号。

感谢您的任何帮助!我很感激。

【问题讨论】:

re:为什么不生成一个随机端口——因为该随机端口可能已经被其他程序或服务使用了。 @MerlynMorgan-Graham 为什么不让系统完全做到这一点,这是它默认已经做的,没有它被使用的风险,然后使用提供的 API 来查找知道它是什么? 【参考方案1】:

使用getsockname。例如:

struct sockaddr_in sin;
int addrlen = sizeof(sin);
if(getsockname(clientSock, (struct sockaddr *)&sin, &addrlen) == 0 &&
   sin.sin_family == AF_INET &&
   addrlen == sizeof(sin))

    int local_port = ntohs(sin.sin_port);

else
    ; // handle error

这也适用于基于 *nix 的系统,但请注意,某些系统将 getsockname 的第三个参数定义为 socklen_t* 类型而不是 int*,因此您可能会收到有关指针不同符号的警告,如果您正在编写跨平台代码。

【讨论】:

"int local_port = sin.sin_port;" --> int local_port = ntohs(sin.sin_port); 谢谢,这对我有用。感谢您的帮助。

以上是关于【Windows编程问题!!】C++根据端口号,获取对应的进程PID,但是有的端口怎么也找不到对应进程,WHY??的主要内容,如果未能解决你的问题,请参考以下文章

如何找到套接字的本地端口号? (Windows C++)

Windows根据端口号关闭进程

windows根据端口号找进程

Windows - 杀死占用某个端口号的进程

windows server 2008 端口号怎么开启

windows查看端口号占用,查看/杀死占用端口号的程序