套接字编程简介

整理自《Unix网络编程卷一》第三章

  套接字通信主要目的是实现数据的交互,但是为了实现数据的交互我们通常还有许多工作要做。如:谁与谁进行数据交互,通信的一端如何知道数据穿给谁,采用什么协议,不同主机对数据的识别有差异(字节序)怎么办。这里我们关注套接字通信的一些控制细节。
 
+ 套接字地址结构
+ 字节序
+ 数据的发送、接收函数

套接字地址结构

  大多数套接字编程主要用于网络通信(Unix域套接字用于同一主机不同进程间通信),网络通信不可避免需要使用到通信两端的地址,这就需要定义地址结构来表示网络地址, 各个协议族(IPv4,IPv6)都会定义自己的套接字地址结构。

  • IPv4 套接字地址结构 struct sockaddr_in
  • 通用 套接字地址结构 struct sockaddr
  • IPv6 套接字地址结构 struct sockaddr_in6
  • Unix 域套接字地址结构struct sockaddr_un
  • 链路层套接字地址结构struct sockaddr_dl
  • 新通用 套接字地址结构 struct sockaddr_storage
    这些套接字地址结构通常包含两个字段,Lensa_family_t。 Len字段用于表示套接字地址结构的长度,即确定边界; sa_familyl_t用于指示套接字地址结构(套接字通信)采用的是什么协议族。
    在这两个字段之外,不同协议族的套接字地址结构会包含一些需要用到的其他字段: 如IPv4和IPv6套接字地址结构都需要IP地址字段和端口号字段以便识别特定主机上的特定进程;而Unix 域套接字地址结构则需要一个绑定进程的路径来识别特定进程。

套接字地址结构的传递

  在网络通信中,我们的套接字通常是服务于应用程序(用户),而应用程序想要与谁通信(哪个地址)通常用户是可以设定的(主动方要设置被动方的地址,也就是数据报要发送给谁)。然而真正的数据传输需要在内核中进行,这就需要把套接字地址从用户层传递给内核层。connect、bind、sendto等函数能够将套接字地址结构从用户层传给内核层。 另外,在一些通信中,被动方(接收到数据后),应用程序想要知道数据从哪里来,这就涉及到如何将套接字地址从内核层传递给用户层。accept、recvfrom、getsockname、getpeername 提供了从内核想用户层传递套接字地址

字节序的转换

  主机字节序:不同的主机(系统)对整型(16bit、32bit、64bit)的内部字节排序可能有所差异。有的采用大端字节序(arm、powerPC等),有的主机采用小端字节序(主要是Inter的一些主机)。在网络通信中,我们会涉及到整型数据的处理(主要是处理套接字地址结构、端口号等,其他数据一般以单字节进行传输),这就需要我们在网络通信时对字节序进行统一。网络通信指定了大端字节序为网络字节序。
  在网络通信中,网络字节序是大端字节序,那么对于小端机器来说,就需要进行字节序转换。下面介绍字节序转换的方法。

函数名16和32 分别表示16bit的值和32bit的值,
字节序转换函数不关心具体的主机字节序是 大端字节序还是小端字节序,他们都会将其转化为网络字节序。

IP地址的 二进制值 与 字符串值 的转换

  计算机系统采用二进制表示数据,包括多自己的IP地址, 而用户(应用程序)常使用字符串(如IPv4的点分十进制字符串)表示IP地址。这就需要进行转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值