Indy是否支持在Windows上使用原始TCP套接字?

3
我是一名C++程序员,但我的问题与Delphi网络套接字库Indy有关。由于微软在WinXP SP2中削弱了原始套接字,以便不能通过它们发送TCP数据,那么这是否也适用于Indy?我的一个朋友建议我使用Indy而不是使用WinSock API。如果不是这样的话,那么使用原始TCP套接字的唯一方法是使用WinPCap API吗?
5个回答

3
如果不行,我知道synapse适用于Delphi最新版本现在支持D2009,正在积极支持。

这并不意味着太多。Indy 10有4个文件IdRaw*.pas在核心中。但是Windows有一些限制(虽然不是所有版本),请参见http://msdn.microsoft.com/en-us/library/ms740548%28VS.85%29.aspx上的“原始套接字限制”。据推测,这些限制与用于调用WinSock API的Delphi库无关。 - mghie
2
Synapse是一个非常强大的工具。此外,如果您计划在一个庞大的服务器上执行多线程和阻塞套接字(=处理成千上万的连接),请记住,根据我的经验,Synapse比Indy更加稳定。同时也更容易理解和修改代码以满足您的需求 :) :) - Olivier Pons

2
如您从其他答案中所见,有很多Delphi库可以简化网络编程。然而,据我所知,它们都提供了一个友好的层来覆盖WinSock API(在Windows上,覆盖其他操作系统上的标准套接字API),因此不能做任何WinSock API无法做到的事情。特别是它们可能支持或不支持原始套接字访问,但如果操作系统无法通过套接字发送数据,则这些库只会返回错误。
有关最近的Windows操作系统版本上原始套接字限制的更多信息,请参见此MSDN页面,尤其是“原始套接字的限制”一节。它非常清楚地指出:
“为了解决这些问题,可能需要为特定的网络协议编写Windows网络协议驱动程序(设备驱动程序)。”
据我所知,Delphi网络编程库都没有自己的网络协议驱动程序。它们也无法帮助您解决有限用户帐户的权限问题或Windows防火墙的干扰。
正如你在问题中提到的WinPcap,你知道它能够实现你想要的功能。有一些Delphi的包装器,比如Magenta Systems Internet Packet Monitoring Components。然而,作为一个C++程序员,你最好直接从C++中使用该库,因为Delphi在你想要进行的套接字编程方面没有任何帮助。特别是,你不需要一些Delphi库提供的隐藏平台差异的额外层,因为你将直接针对libpcap API进行编程。

1

Indy工作得相当不错。我经常使用它,几乎没有什么问题。

如果你正在寻找更基本的套接字交互,可以使用以下其他组件:

  • TTCPClient
  • TCPServer
  • TClientSocket
  • TServerSocket

所有这些组件也随Delphi一起发货。

我不知道winpcap直接相关,但我相信有一个delphi封装器。我目前不知道我在哪里看到它,但使用Google代码搜索应该不难找到。


是的,但Indy在Windows中支持原始TCP套接字吗? - max tottenham
也许你应该问问自己:“我是否一定要使用原始套接字?”因为这似乎是一个很大的问题(请参见其他答案)。如果你能找到不需要使用原始套接字的解决方案,那么你可能会节省很多时间。 - Olivier Pons

1

你应该检查ICS组件

ICS是一个免费的互联网组件库,适用于所有Delphi、C++Builder、BDS和RAD Studio版本(win32)。它包括TCP、UDP、原始套接字、客户端、服务器,以及许多高级协议,如FTP、SMTP、POP3、NNTP、HTTP等。

http://www.overbyte.be/


1

我更喜欢synapse而不是Indy,因为它的架构更简单,因此更容易理解。


那么,Indy是否支持原始套接字? - Rob Kennedy
3
可以,但这取决于操作系统对此类套接字的限制。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接