【问题标题】:Best way to handle tcp/udp reception.处理 tcp/udp 接收的最佳方式。
【发布时间】:2012-12-12 23:44:39
【问题描述】:

我正在编写一个简单的程序,通过网络侦听传入的 tcp/udp 数据包并从中检索数据。我还需要解析数据包头以获取序列号等。我正在运行 windows7 和 VC++ 2010。

显然我需要一个数据包生成器,并且我想使用环回地址,以便发送方和接收方在同一台机器上。

由于我是 C++ 网络编程的初学者,我需要一些帮助来弄清楚如何进行。

我应该建立自己的 tcp/udp 生成器吗?如果是,我必须使用 RAW 套接字还是更高级别的 api 就足够了(获取 ip 标头的可能性)。如果不是,应该使用哪个生成器?

我应该为接收器使用什么技术?我在看 boost::asio 和 winsock2.h。但是由于我没有太多时间来发现它们,有人可以告诉我该怎么做。

非常感谢您的帮助。

最好的问候。

【问题讨论】:

  • 不清楚您是否正在编写通信套接字端点(例如客户端或服务器),或者您是否正在尝试拦截您直接控制之外的其他两个实体之间发生的通信。如果您对自己在做什么不太了解,请使用 Winsock 接口,因为它与几乎无处不在的 BSD 套接字接口基本相同。
  • @GregHewgill 感谢您的回复。实际上它是套接字端点。考虑使用winsock,我可以解析ip头吗?我应该使用它在 Google 上搜索“如何创建 RAW 套接字”吗? MSDN 说Limitations on Raw Sockets : TCP data cannot be sent over raw sockets. 是什么意思?

标签: c++ sockets boost tcp udp


【解决方案1】:

如果您使用的是 winsock,那么您根本不必担心解析 IP 标头。 Winsock(确实是操作系统)为您完成了所有这些工作。无需使用原始套接字(我从事网络编程 20 多年,从未需要使用原始套接字!)。

所以对于一个客户,你想要的函数是socket/connect/send/recv。对于服务器,socket/bind/listen/accept/recv/send

【讨论】:

  • 感谢您的这些好建议。你觉得这段代码怎么样?我应该遵循这些步骤吗? nullterminator.net/winsock.html 线程安全吗?我可以在客户端创建 2 个线程,一个用于 udp 数据包,一个用于 tcp 吗?我有点困惑,我希望你不介意问你几个问题,并从你的经验中获益一点,先生。实际上,我想要一个通过控制标头中的序列号来检测数据包丢失的程序。是否可以创建一个服务器程序来启动一定数量的消息(每条消息都包含一个自定义结构)?
  • 这些消息是否会使用winsock封装在按ip序列号排序的数据包中?
  • 哦,检测丢包是完全不同的事情。 TCP 通过在需要时重新传输信息来自动处理数据包丢失,并且应用程序永远不需要知道正在发生重新传输。使用 TCP,您放入一端的字节要么全部以相同的顺序从另一端出来,要么出现错误(如超时)并且套接字将被关闭。
  • 另一方面,UDP 不提供重传或丢包检测。这意味着您可以使用应用程序中的 UDP 来确定是否所有数据包都到达了接收方。只需在 UDP 数据包中输入一个数字,每次发送时递增,然后在接收方中查找数字。
  • 使用 Winsock,它提供你需要的一切。
猜你喜欢
  • 2013-11-27
  • 1970-01-01
  • 2013-10-04
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多