收听UDP套接字并转发到TCP套接字(可能是Java)

时间:2016-07-11 01:40:44

标签: java tcp udp packet

有没有办法通过UDP监听器监听UDP数据包,然后将数据转换成字符串或任何东西,并通过TCP套接字发送到TCP服务器,我不是很熟悉UDP,所以任何提示都会很棒

1 个答案:

答案 0 :(得分:-2)

我不担心UDP到TCP我会担心反过来。

您无法通过UDP接收适合您缓冲区的内容,因此所有收到的内容都会转换为一个或多个TCP发送。

另一方面,TCP是基于段的协议,您可能只接收已经确认并且可用于应用程序缓冲区的重组段的一部分,这可能不是所有情况下的整个应用层消息,因为我将说明。

设数据= 30,000字节的数据......

要在机器中的某个位置获取此数据,您只需传递指针即可将其传送到另一台机器,您必须使用通常通过驱动程序访问的网络或硬件应用程序。

套接字是一种常见的设计范例或更简洁的接口,它允许非常不同的网络和媒体进行异构通信......

通过套接字,您可以简单地担心IP或TCP或UDP等协议可能是ICMP,您不必担心数据如何进入硬件。

网络堆栈通常是操作系统的一个组件,它与硬件和软件驱动程序互操作并隐藏在Socket接口后面,这样当只关注协议时,硬件和网络的语义无关紧要...

返回数据......

发送的数据将被分成几个可以放在网络媒体上的数据包,通常称为最大可传输单元。

它允许介质所需的标题字段以及足够的数据量,以允许对驱动程序进行流控制。

驱动程序接收此数据并创建可在中型和本地计算机网络上轻松发送和接收的网络数据包。

要进入物理网络,必须在数据包中添加其他层,例如IP和协议头,在本例中为TCP。

网络堆栈让驱动程序知道数据已准备好在发送呼叫期间发送。

数据被复制到网络堆栈,应用程序可以继续(TCP或UDP)

协议在tcp下以最大段大小或更小的协议创建段,并传输它们。

当收到任何一个片段并通过致电recv收到确认后。

数据的顺序由网络堆栈维护,如果没有收到整个段,则重新发送。如果收到段的一部分,则将其保持到收到并确认之前的段为止。

TCP的某些实现允许部分接收的段可供应用程序缓冲区使用(通过特殊配置或其他方式,通常禁用tcp重新传输以及发送和接收合并但不限于),即使丢失或在接收期间,片段的一部分内发生了碎片,通常该片段的其余部分已收到并在下次接收期间提供给应用程序,但是完全有可能从新片段和旧数据到达更多数据从来没有到达或到达这么晚,以至于您的申请没有资格收到已经发布到申请表的数据。

因此,您通常并最终会在接收端接收30,000个字节(实际上由于IP和TCP开销而实际上相当多)但在某些情况下您很可能无法接收数据或不接收数据总而言之,这可能是由于你和接收者之间的路线上的硬件故障,当然不是常态,但确实可能发生。

在这种情况下,应用层应该能够通过在应用协议中使用序列号或通过扫描可以通过各种方式实现的IP和TCP报头来确定何时发生此异常。

希望这足以让你思考......也请看When sending data larger than the SendBufferSize, how will the data be received?