Day34

Day34

网络协议模型

IP地址

为区分互联网上的每个网络和每台主机而分配的地址格式

在计算机内部IP地址用一个32位无符号整数表示,如0x01020304

但人们习惯用点分十进制表示,如1.2.3.4

IP地址分级

A级:以0为首的8位网络地址+24位本地地址

B级:以10为首的16位网络地址+16位本地地址

C级;以100为首的位网络地址+8位本地地址

D级:以1000为首的32位多播地址

网络地址=IP地址&子网掩码

本地地址=IP地址&~子网掩码

套接字

机器与机器、进程与进程通信可以抽象地看成套接字与套接字的通信,套接字可以看成一个文件描述符,通信可以看成对套接字的读写,IP地址区分不同设备,端口号区分同一个设备不同进程(端口号是一个16位无符号整数,0~65535之间,1024之前的被系统占用了)

套接字在网络通信的使用

绑定:将套接字与硬件设备相关联

连接:建立跨越不同设备,多个套接字对象之间的联系

套接字相关函数

#include <sys/socket.h>

int socket(int domain, int type, int protocol);

功能:创建套接字

参数:domain 通信域、协议族,

PF_LOCAL/PF_UNIX 本地套接字,进程间通信

PF_INET 基于IPv4的网络通信

PF_INET6 基于IPv6的网络通信

PF_PACKET 基于底层包的网络通信

  type 套接字类型

SOCK_STREAM 流式套接字,基于TCP协议

SOCK_DGRAM 数据报套接字,基于UDP协议

SOCK_RAW 原始套接字,工作在传输层以下

  protocol 特殊协议,对于流式套接字和数据报套接字而言,只能取0

返回值:成功返回套接字对象的文件描述符,失败返回-1

基本地址结构,泛化参数

struct sockaddr{

sa_family_t sa_family; //地址族

char sa_data[14]; //地址值

}

本地地址结构,用于AF_LOCAL/AF_UNIX域的本地通信

struct sockaddr_un{

sa_family_t sun_family; //地址族(AF_LOCAL/AF_UNIX)

char sun_path[]; //本地套接字文件路径

}

网络地址结构,用于AF_INET域的IPv4网络通信

struct sockaddr_in{

sa_family_t sin_family; //地址族(AF_INET)

in_port_t sin_port; //端口号(0~65535)-unsigned short

struct in_addr sinaddr; //IP地址-unsigned int

}

#include <sys/socket.h>

int bind(int sockfd, struct sockaddr const* addr, socklen_t addrlen);

功能:将套接字和本地的地址结构绑定在一起

参数:sockfd 套接字描述符

  addr 自己的地址结构

  addrlen 地址结构的字节数

返回值:成功返回0,失败返回-1

#include <sys/socket.h>

int connect(int sockfd, struct sockaddr const* addr, socklen_t addrlen);

功能:将套接字和对方的地址结构连接在一起

参数:sockfd 套接字描述符

  addr 对方地址结构

  addrlen 地址结构的字节数

返回值:失败返回0,成功返回-1

字节序转换

网络传输采用大段字节序,而本机数据可能时小端字节序

小端字节序:数据低位放低地址

大端字节序:数据低位放高地址

转换函数

32位转换

uint32_t htonl(uint32_t hostlong);//主机字节序到网络字节序

uint32_t ntohl(uint32_t netllong);//网络字节序到主机字节序

16位转换

uint16_t htonl(uint16_t hostshort);//主机字节序到网络字节序

uint16_t ntohl(uint16_t netshort);//网络字节序到主机字节序

in_addr_t inet_addr(char const* ip);

点分十进制字符串地址 -> 网络字节序形式整数地址

char* inet_ntoa(struct in_addr nip);

网络字节序形式整数地址 -> 点分十进制字符串地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值