类型为SOCK_DGRAM可以获得一个UDP套接字。当然,您可以将UDP封装在TCP中,但是您必须在用户空间处理UDP部分。是否可靠取决于线路上的协议。如果使用TCP,则是可靠的;UDP则不可靠。
要创建UDP套接字:
int s;
s = socket(AF_INET, SOCK_DGRAM, 0);
int s;
s = socket(AF_INET, SOCK_STREAM, 0);
在网络传输数据时,有两种常见方式。一种是使用UDP,将离散的数据块作为数据报发送;另一种则是将结构体放入TCP数据流中进行传输。通常来说,使用TCP更加简单,且容错性更强。如果使用UDP,则需要定期超时并重复请求相同的数据,直到成功获取为止。
不完全是这样。TCP和UDP是同一层的协议,它们具有仅对它们有意义的功能。例如,以listen()和accept()为例。
你可以在TCP数据包中发送UDP头+数据,但这根本没有意义。你为什么要这样做?一种隧道的方式吗?实际上,手动解析和构建UDP数据包非常容易,但我在你的场景中看不到真正的应用。
我还没有看到任何提供这个选项的套接字API - 这也会破坏TCP的一些目的,让您控制数据对齐。TCP只是传输层,它的抽象是一个字节流。
您将不得不在TCP之上构建自己的消息结构,以便为应用程序层关心的消息提供概念。
你可以模拟一些东西,但实际上没有理由这样做。你要么想要可靠的传递,要么想要及时的传递。TCP提供了前者,UDP提供了后者。两者不能混合使用,因为TCP通过不断告诉另一端有关消息直到它们被确认来实现可靠性。对于流式传输,通常需要可靠的数据传递(以便您可以重新组装流),但对于不重要顺序的小消息(即数据报),您不需要所有这些开销(UDP基本上保证消息至少不会乱码;这是TCP和UDP在原始IP上提供的其中之一)。
当然,在这两个极端之间还有一些其他有趣的情况。对于实时流媒体数据(例如视频通话),您使用RTP,因为您正在流式传输,但可以更好地从数据丢失中恢复而不是延迟。对于太大而无法使用UDP的消息(64kB是严格的上限,因为UDP头只有16位用于其长度字段),您几乎需要使用TCP进行传输,以便您可以重新组装片段(因此SOAP通过HTTP通过TCP进行传输,而不是通过UDP)。