2011-01-06 59 views
2

最近我开始研究一个程序,该程序将监视我的一个开源程序的数据包,以尝试了解有关编程和网络的更多信息。另外,我想为程序添加额外的功能而无需编辑源代码,就像外部控制面板一样。 (我使用WPE Pro过滤数据包以防万一你想知道,WireShark对于这样一个简单的任务来说太麻烦了。)有一件事让我困扰,但是Socket ID。C#查找套接字ID?

我知道它是什么,之前我已经问过一个关于它的问题,但我不知道如何使用它/分配一个/截取一个。

没有正确的套接字ID,我的程序将无法做任何事情,所以我的问题是,如果有可能找出套接字ID套接字使用,一旦你捕获数据包?

如果不是,还有其他方法吗? - 或Visual Basic等其他语言?

谢谢你的时间。

+0

Duplicate http://stackoverflow.com/questions/2742763/how-to-get-socket-id-handle-descriptor-for-an-already-open-connection-net-c – dzendras 2011-01-06 13:56:52

+0

答案有错,SharpPcap不能获取套接字ID。如果我错了,请以答案的形式纠正我,因为这正是我要找的。 – Nick 2011-01-06 14:12:27

回答

4

如果通过插座ID,你的意思是一个成功的调用的返回值socket()功能,我不认为有一种方式。

您可以获得最接近的进程ID,因为您可能已经知道,每个IP数据包都有一个由元组(IP地址,端口)描述的目的地,并且在系统内部只有一个套接字可以成功绑定到那个元组。像TCPView这样的工具能够将一个IP元组映射到一个进程,所以如果这个信息对于你来说足够了,那么方式确实存在

如果不是这种情况,我不知道任何方法来检索您需要的套接字ID 如果目标应用程序不合作。

+0

首先,感谢您的回复。使用WPE Pro过滤数据包时,每个数据包都具有相同的“套接字标识”以唯一标识连接。因此,如果我理解正确,那么套接字ID有可能等于程序的进程ID,尽管它可以随时间变化吗?我希望程序的源代码能帮助我,但是我找不到任何与创建套接字连接有关的任何东西。 – Nick 2011-01-11 08:15:29

0

socket()返回文件描述符,如果这是你指的是作为一个插座ID那么,什么方式得到这个没有进程的合作在Windows上是有限的。在Linux开放式FD上的FWIW被列举在proc文件系统中。

这就是说,你可以用fd做的唯一事情就是从套接字发送附加信息。您也可以从fd中读取数据,但以这种方式读取的任何数据将被发送到拥有该套接字的应用程序,而不是而不是。如果没有一些协调,这可能不会成为你想要的,因为你只会得到一些数据。

如果只是希望能够窃听到在你的程序的流量,然后像包过滤应该是足够的,所以我假设你真的想能像在中间它的人。

如果是这种情况,那么最好的做法是将您的应用程序设置为其他服务的代理。

我的意思是,写打开一个监听端口,并接受连接发起连接时,应立即打开自己的连接到一个预配置的IP的程序:端口组合,并开始转发流量。一旦写完,在转发和可能修改之前检查流量是一件简单的事情。

如果你的程序是一个服务器,一个非标准端口上运行,配置此应用程序打开服务器的正常端口,然后转发给你设置localhost上非标准端口的连接。

如果您的程序是客户端,只需将拦截器应用程序指向服务器,然后在您的盒子上选择一个随机侦听端口。然后将客户端配置为连接到此侦听端口,就像它是服务器一样。

这应该适用于任何事情。唯一需要注意的是,如果流量被加密,您将显然无法检查/修改它。这与将您的应用程序放置在NAT后面的效果相同。

1

此库:SharpPcap承诺使用任何.NET语言(如C#和VB.NET(more info))捕获,注入,分析和构建数据包。

它是由Wireshark使用的库,它确实可以捕获和分析。