我刚看到这个奇怪的东西,我看到应用程序是默认情况下他们使用的SOCK_STREAM
功能.为什么会这样?这SOCK_STREAM
只是创建多个流吗?或者它是SOCK_STREAM
可用于创建TCP流的标准功能?
我认为海啸基于UDP,但仍然具有TCP的一些功能,例如TCP公平性,友好性等.
有人可以就这个问题说清楚吗?我完全对此感到困惑.
TCP几乎总是使用SOCK_STREAM,UDP使用SOCK_DGRAM.
TCP/SOCK_STREAM是基于连接的协议.建立连接并且双方进行对话,直到连接被一方或网络错误终止.
UDP/SOCK_DGRAM是基于数据报的协议.您发送一个数据报并获得一个回复,然后连接终止.
如果您发送多个数据包,TCP承诺按顺序提供它们.UDP没有,所以接收者需要检查它们,如果顺序重要.
如果TCP数据包丢失,发件人可以告诉.对UDP来说并非如此.
UDP数据报的大小有限,从内存我认为是512字节.TCP可以发送比这更大的块.
TCP更健壮,可以进行更多检查.UDP的重量更轻(计算机和网络压力更小).
选择适合您希望与其他计算机进行交互的协议.
更新:我的答案似乎没有更多相关性,但最初的问题涉及UDT,这是一种建立在UDP之上的面向连接的协议.更多信息:http://en.wikipedia.org/wiki/UDP-based_Data_Transfer_Protocol
UDT似乎提供了模仿经典BSD套接字API的API,因此它可以用作流和面向数据报的应用程序的替代品.检查eg sendmsg
和recvmsg
- 如果在创建的套接字上使用SOCK_STREAM
,则抛出异常,并且所有面向流的API都会为使用它创建的套接字抛出异常SOCK_DGRAM
.
SOCK_DGRAM
但是,如果它执行一些额外的处理,它不会简单地在这种情况下透明地包装UDP套接字 - 据我快速审查后了解代码(我不熟悉UDT内部或协议规范).阅读技术论文可能会有很大帮助.
该库总是将其底层的"真实"套接字创建为数据报(查看channel.cpp CChannel::open
).