【Windows编程问题!!】C++根据端口号,获取对应的进程PID,但是有的端口怎么也找不到对应进程,WHY??
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【Windows编程问题!!】C++根据端口号,获取对应的进程PID,但是有的端口怎么也找不到对应进程,WHY??相关的知识,希望对你有一定的参考价值。
我想抓包的时候,同时找到发送这个数据包的PID。
所以需要一个由端口号得到PID的函数
我试过了两种办法。
一种是csdn上面给的那种函数
一种是用 netstat -ano|findstr “”直接找
但是有的端口怎么也找不到?
为什么?是因为他们是UDP的吗?UDP数据包发送完了以后,进程就退出了,所以找不到了吗?
多谢!!
这个命令肯定可以得,我建议你使用循环调用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??的主要内容,如果未能解决你的问题,请参考以下文章