Linux下的网络套接字

网络套接字又叫socket套接字,在不同的条件下谈的socket可能会代表不同的含义。我这里主要谈的是用来进行不同主机中的进程间通信的套接字。

套接字由两部分组成socket:[IP地址+端口号]

IP地址是在互联网中用来唯一标识一台主机的地址,端口号是在一台主机中用来唯一标识一个进程的。

但是在前面的文章中有提到过,Linux或其他操作系统中,,进程ID用来唯一标识一个进程,那么端口号与进程ID有什么区别呢?

其实这两者之间并没有什么直接联系!!进程ID是操作系统内用来唯一标识一个进程的,而端口号是两个不同主机间的进程进行通信所使用的标识。

  • 端口号是一个2字节的16位的整数
  • 一个端口号只能被一个进程占用

五层模型的传输层中,有两个协议UDP和TCP,他们需要通过端口号来确定将数据交付给上层应用层的哪一个进程。

socket编程接口

socket可以看成是用户进程与内核网络协议栈的编程接口。

常见的接口有如下这些:

// 创建 socket ⽂文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端⼝口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,
socklen_t address_len);
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,
socklen_t* address_len);
// 建⽴立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);

传输层往下的接口都是内核封装好提供接口供我们使用。

socket套接字使得异构系统间可以进行通信(手机-PC)。

IPV4套接字地址结构

因为在网络中,有各种不同的协议,IPV4/IPV6等,为了完成异构通信,所以通过协议家族来确定本主机所采用的协议。

struct sockaddr_in{
uint8_t sin_len;
sa_family_t sin_family; //协议家族  IPV4中为AF_INET
    //因为协议不仅仅有TCP/IP
in_port_t sin_port;     //端口号,最大65535
struct in_addr  sin_addr;   //地址定位  无符号32位整数
char sin_zero[8];       //保留
};

通用地址结构

struct sockaddr{
uint8_t sin_len;        //结构体大小
sa_family_t sin_family;
char sa_data[14];       //相当于IPV4的后三个属性,故上下兼容
};

网络字节序

为了实现异构系统间的通信,故引入大端字节序和小端字节序的概念。

数据低位存放于低地址处,高位存放于高地址处称为小端字节序。

数据低位存放于高地址处,低位存放于高地址处称为大端字节序。

我们在将数据发送至网络的时候,并不清楚发往了何种系统,故统一采用大端字节序,然后由该系统本身决定是否转换字节序,所以大端字节序为网络字节序。

字节序转换函数

uint32_t htonl(uint32_t hostlong);      //主机转网络,long类型
uint32_t htons(uint32_t hostshort); //主机转网络,short类型
uint32_t ntohl(uint32_t hostlong);      //网络转主机,long类型
uint32_t ntohs(uint32_t hostlong);      //网络转主机,short类型

上述函数中,h代表host;n代表network;s代表short;l代表long

地址转换函数

int inet_aton(cosnt char*cp, struct in_addr* inp);  //将点分十进制的IP地址转换为网络字节序的32位无符号整数,通过输出型参数inp将参数传递出去
in_addr_t inet_addr(const char* cp);        //将点分十进制的IP地址转换为网络字节序的32位无符号整数,通过返回值传递
char *inet_ntoa(struct in_addr in);     //将32位的无符号整数转换为点分十进制的IP地址,通过返回值传递

套接字类型
流式套接字(SOCK_STREAM) //TCP
TCP(传输控制协议)是面向字节流的,字节流这一概念表示所传输的数据没有固定的格式,所以有可能造成黏包问题,我们应由上层协议来确定数据的大小。

数据报套接字(SOCK_DGRAM) //UDP
UDP(用户数据报协议)是面向数据报的协议,数据报的概念就是双方事先约定好所传输的数据类型,如大小,类型等等。

原始套接字(SOCK_RAW):跨越传输层,直接对IP层进行操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值