关于套接字类型与协议设置

本文详细介绍了协议在数据交换中的作用,以及如何使用socket函数创建套接字,重点讨论了面向连接的SOCK_STREAM和面向消息的SOCK_DGRAM两种套接字类型的区别。此外,还讲解了网络地址、端口号的概念以及它们在网络数据传输过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、 协议
协议就是为了完成数据交换定好的约定

2、 创建套接字
socket(int domain,int type,int protocol);

domain:套接字中使用的协议族 PF_INET IPv4互联网协议族
type:套接字数据传输类型信息 SOCK_STREAM SOCK_DGRAM
protocol:计算机间通信中使用的协议信息 IPPROTO_TCP IPPROTO_UDP

3、 套接字类型
套接字类型就是套接字的数据传输方式。

  1. 面向连接的套接字(SOCK_STREAM)
    特点:
    传输过程中数据不会消失
    按序传输数据
    传输的数据不存在数据边界

怎么理解数据边界的问题?
传输数据的计算机通过三次调用write函数传递了100字节的数据,但接收数据的计算机仅通过1次read函数调用就接收了全部的100个字节。

收发数据的套接字内部有缓冲区(buffer),简而言之就是字节数组。通过套接字传输的数据将保存到该数组。因此收到数据并不意味着马上调用read函数。只要不超过数组容量。则有可能在数据填充满缓冲后通过1次read函数调用读取全部,也有可能分成多次read函数调用进行读取。
就是说,在面向连接的套接字中,read函数和write函数的调用次数并没有太大意义。

总结:
套接字连接必须一对一
可靠的、按序传递的、基于字节的面向连接的数据传输方式的套接字

  1. 面向消息的套接字(SOCK_DGRAM)
    特点:
    强调快速传输而非传输顺序
    传输的数据可能丢失也可能损坏
    传输的数据有边界
    限制每次传输的数据的大小

怎能理解传输有数据边界?
发送两次,就需要接收两次。

总结:
不可靠的、不按序传递的、以数据的高速传输为目的的套接字

DEMO:
在客户端中分多次调用read函数以接收服务器发送的全部数据
Char message[30];
While(read_len = read(sock,&message[index++]),1)
{
If(read_len == -1)
Error
Str_len+=read_len;
}

地址组与数据序列

3.1分配给套接字的IP地址与端口号

网络地址:
IP是Internet Protocol(网络协议)的简写,是为收发网络数据而分配给计算机的值。
端口并不是赋予计算机的值,而是区分程序中创建的套接字而分配给套接字的值。

网络地址:
IPv4 :4字节地址族
IPv6:16字节地址族

IPv4标准的4字节IP地址分为网络地址和主机(计算机)地址,且分为A、B、C、D、E(不常用)
只需要通过IP地址的第一个字节即可判断网络地址占用的字节数
A类地址的首字节范围:0-127
B类地址的首字节范围:128-191
C类地址的首字节范围:192-223

网络地址(网络ID)是区分网络而设置的一部分IP地址。

图数据传输过程
Xxx

某主机向203.211.172.103和203.211.172.202传输数据。其中203.211.172和203.211.172为该网的网络地址。所以,“向相应网络传输数据”实际是向构成网络的路由器(Router)或交换机(Switch)传递数据,由接收数据的路由器根据数据中的主机地址向目标主机传递数据。

路由器和交换机
若想构建网络,需要一种物理设备完成外网与本网主机之间的数据交换,这种设备就便是路由器或者交换机,它们实际上也是一种计算机,只不过是为特殊目的而设计运行的,一次有了别名。

用于区分套接字的端口号
IP用于区分计算机,只要有IP地址就能向目标主机传输数据,但是仅凭这些无法传输给最终的应用程序。
计算机中一般配有NIC(network interface card网络接口卡)数据传输设备。通过NIC向计算机内部传输数据时会用到IP。操作系统负责把传递到内部的数据适当分配给套接字,这时候就需要利用端口号。也就是说,通过NIC接收的数据内有端口号,操作系统正是参考此端口把数据传输给相应端口的套接字。

图xxx

端口号就是在同一操作系统内为区分不同套接字设置的,因此无法将1个端口号分配给不同的套接字。另外,端口号由16位构成,可分配的端口号范围有0-65535。但0-1023是知名端口,一般分配给特定的应用程序,所以应当分配此范围之外的值。
另外,虽然端口号不能重复,但TCP套接字和UDP套接字不会共用端口号,所以允许重复。

地址信息的表达
Struct sockaddr_in
{
Sa_family_t sin_family; //地址族
Uint16_t sin_port;
Struct in_addr sin_addr;
Char sin_zero[8];
};

结构体sockaddr_in的成员分析:
sin_family
AF_INET IPv4网络协议中使用的地址族
AF_INET6 IPv6网络协议中使用的地址族

sin_port
该成员保存16位端口号,重点在于,它以网络字节序保存htons

sin_addr
该成员保存32位IP地址信息,且以网路字节序保存。htonl

网络字节序与地址变换

保存顺序的不同意味着对接收数据的解析顺序也不同

字节序(order)与网络字节序
CPU向内存保存数据的方式有2种,这意味着CPU解析数据的方式也分为2种:
大端序:高位字节存放到低位地址
小端序:高位字节存放到高位地址

假设在0x20号开始的地址中保存4字节int型数0x12345678

大端序CPU:

小端序CPU:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值