Linux网络IPC: Socket套接字的介绍和使用

不同主机间的相互通信:❤️

  • 进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施:

    • UNIX BSD有:管道(pipe)、命名管道(named pipe)软中断信号(signal)
    • UNIX system V有:消息(message)、共享存储区(shared memory)和信号量(semaphore)等.
  • 上述的进程间通信的方式都是依靠Liunx内核进行的,所以只能用在本机进程之间通信。网间进程通信就解决了不同主机进程间的相互通信的问题

  • IP地址:在Internet上为每台计算机指定的唯一的32位地址称为”IP地址“,也称”网际结构“。IP地址具有固定、规范的格式,它由32位二进制数组成,分成4段,其中每8位构成一段,这样,每段所能表示的二进制数的范围最大不超过255,段与段之间用”."隔开。为了便于标识和表达,IP地址以十进制形式表示,每8位二进制数用一个十进制数表示。

    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    int inet_aton(const char* straddr,struct in_addr *addrp);//点分十进制转二进制,第一个参数为十进制IP,第二个参数指向二进制的存放
    char* inet_ntoa(struct in_ addr inaddr);//二进制转点分十进制
    
  • TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。

  • TCP/IP协议存在于OS中,网络服务通过OS提供,在OS中增加支持TCP/IP的系统调用——Berkeley套接字,如Socket,Connect,Send,Recv等

  • UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种:

在这里插入图片描述

  • TCP/IP协议族包括运输层、网络层、链路层,而socket所在位置如图,Socket是应用层与TCP/IP协议族通信的中间软件抽象层。
    在这里插入图片描述

套接字socket:❤️

  • socket即是一种特殊的文件(S),可以用“打开open –> 读写write/read –> 关闭close”模式来操作
  • socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
  • 其实socket也没有层的概念,它只是一个facade设计模式的应用,让编程变的更简单。是一个软件抽象层。在网络编程中,我们大量用的都是通过socket实现的。

网络字节序与主机字节序:❤️

  • 字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序

  • 主机字节序就是我们平常说的大端和小端模式:不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。引用标准的Big-Endian和Little-Endian的定义如下:

    • Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
    • Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
      图片 上图来自网络
      在这里插入图片描述
  • 网络字节序:4个字节的32bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。由于TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。

  • 字节序转换函数

    #include <arpa/inet.h>
    
    uint32_t htonl(uint32_t hostlong);
    
    uint16_t htons(uint16_t hostshort);
    
    uint32_t ntohl(uint32_t netlong);
    
    uint16_t ntohs(uint16_t netshort);
    //h表示host,主机,n表示network,网络,l表示32位长整数(long),s表示16位短整数(short)。
    

Socket编程:❤️

Socket编程的一般步骤

服务端:

  • 创建Socket套接字,用Socket ()函数

  • 设置Socket属性

  • 为套接字添加信息(IP地址和端口号)用bind()函数

  • 开启监听,用listen()函数

  • 监听到有客户端接入,接受一个连接,用accept()函数

  • 交换数据,用函数send()和recv(),或者用read(),write()

  • 关闭套接字,断开连接

客户端:

  • 创建一个Socket,用Socket函数
  • 设置Socket属性
  • 连接服务器,用connect()函数
  • 交换数据,用函数send()和recv(),或者用read(),write()
  • 关闭网络连接

List item

socket接口函数

头文件

#include <sys/types.h>
#include <sys/socket.h>

Socket函数

  • 函数原型

    int socket(int domain, int type, int protocol);
    
  • 功能:用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源的函数

  • 参数:

    • protofamily:协议族(family)。常用的协议族有:AF_INET(IPV4)、AF_INET6(IPV6)、AF_LOCAL、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。
    • type:指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。
    • protocol:指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

money的大雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值