最近,我一直在研究使用c代码和密码技术建立网络,在思考随机问题时,我偶然发现了一个用于探测数据包的代码块,我还对函数recvfrom()中使用的实际套接字提出了一个问题。套接字通过下面的sock函数rawSock = socket(AF_INET, SOCK_RAW, 0)初始化。
我知道SOCK_STREAM和SOCK_RAW是代表整数的宏;但问题不是关于值,而是关于结果。
什么时候我会在SOCK_RAW上使用SOCK_STREAM,反之亦然?
我理解使用SOCK_STREAM的基本客户端和服务器通信。我正在使用C和Linux
发布于 2018-06-16 15:01:00
读手册页。
为原型
int socket(int domain, int type, int protocol);类型可以是
SOCK_STREAM Provides sequenced, reliable, two-way, connection-
based byte streams. An out-of-band data transmission
mechanism may be supported.或
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)接收数据报,它将返回下一个数据报及其发件人的地址。
https://stackoverflow.com/questions/50888934
复制相似问题