当前位置:  开发笔记 > 编程语言 > 正文

什么是SOCK_DGRAM和SOCK_STREAM?

如何解决《什么是SOCK_DGRAM和SOCK_STREAM?》经验,为你挑选了2个好方法。

我刚看到这个奇怪的东西,我看到应用程序是默认情况下他们使用的SOCK_STREAM功能.为什么会这样?这SOCK_STREAM只是创建多个流吗?或者它是SOCK_STREAM可用于创建TCP流的标准功能?

我认为海啸基于UDP,但仍然具有TCP的一些功能,例如TCP公平性,友好性等.

有人可以就这个问题说清楚吗?我完全对此感到困惑.



1> Michael J..:

TCP几乎总是使用SOCK_STREAM,UDP使用SOCK_DGRAM.

TCP/SOCK_STREAM是基于连接的协议.建立连接并且双方进行对话,直到连接被一方或网络错误终止.

UDP/SOCK_DGRAM是基于数据报的协议.您发送一个数据报并获得一个回复,然后连接终止.

如果您发送多个数据包,TCP承诺按顺序提供它们.UDP没有,所以接收者需要检查它们,如果顺序重要.

如果TCP数据包丢失,发件人可以告诉.对UDP来说并非如此.

UDP数据报的大小有限,从内存我认为是512字节.TCP可以发送比这更大的块.

TCP更健壮,可以进行更多检查.UDP的重量更轻(计算机和网络压力更小).

选择适合您希望与其他计算机进行交互的协议.



2> Code Painter..:

更新:我的答案似乎没有更多相关性,但最初的问题涉及UDT,这是一种建立在UDP之上的面向连接的协议.更多信息:http://en.wikipedia.org/wiki/UDP-based_Data_Transfer_Protocol


UDT似乎提供了模仿经典BSD套接字API的API,因此它可以用作流和面向数据报的应用程序的替代品.检查eg sendmsgrecvmsg- 如果在创建的套接字上使用SOCK_STREAM,则抛出异常,并且所有面向流的API都会为使用它创建的套接字抛出异常SOCK_DGRAM.

SOCK_DGRAM但是,如果它执行一些额外的处理,它不会简单地在这种情况下透明地包装UDP套接字 - 据我快速审查后了解代码(我不熟悉UDT内部或协议规范).阅读技术论文可能会有很大帮助.

该库总是将其底层的"真实"套接字创建为数据报(查看channel.cpp CChannel::open).

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有