首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux SOCK_RAW和SOCK_STREAM有什么区别?

Linux SOCK_RAW和SOCK_STREAM有什么区别?
EN

Stack Overflow用户
提问于 2018-06-16 14:49:16
回答 1查看 4.8K关注 0票数 5

最近,我一直在研究使用c代码和密码技术建立网络,在思考随机问题时,我偶然发现了一个用于探测数据包的代码块,我还对函数recvfrom()中使用的实际套接字提出了一个问题。套接字通过下面的sock函数rawSock = socket(AF_INET, SOCK_RAW, 0)初始化。

我知道SOCK_STREAMSOCK_RAW是代表整数的宏;但问题不是关于值,而是关于结果。

什么时候我会在SOCK_RAW上使用SOCK_STREAM,反之亦然?

我理解使用SOCK_STREAM的基本客户端和服务器通信。我正在使用C和Linux

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-16 15:01:00

手册页

为原型

代码语言:javascript
复制
int socket(int domain, int type, int protocol);

类型可以是

代码语言:javascript
复制
   SOCK_STREAM     Provides sequenced, reliable, two-way, connection-
                   based byte streams.  An out-of-band data transmission
                   mechanism may be supported.

代码语言:javascript
复制
   SOCK_RAW        Provides raw network protocol access.

在一行中,SOCK_STREAM用于面向连接的套接字,其中底层操作系统为L4 (TCP)、L3和L2创建和管理报头。OTOH SOCK_RAW提供了对报头和包构造的更细粒度的控制,用户必须构造和提供报头,也可以管理内容。

详细说明:

SOCK_STREAM类型的套接字是全双工字节流.它们不保留记录边界。在发送或接收任何数据之前,流套接字必须处于连接状态。使用connect(2)调用创建到另一个套接字的连接。一旦连接,可以使用读(2)和写(2)调用或发送(2)和recv(2)调用的某些变体来传输数据。当会话已经完成时,可以执行关闭(2)。频带外数据也可以按发送(2)中描述的方式发送,并按recv(2)中描述的方式接收。

SOCK_RAW套接字允许向sendto(2)调用中指定的通讯员发送数据报。通常使用recvfrom(2)接收数据报,它将返回下一个数据报及其发件人的地址。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50888934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档