套接字编程:
1.网络字节序:
字节序:cpu对内存中的数据进行存取的顺序
主机字节序:取决于cpu的架构 x86-小端字节序
大端字节序:低地址存高位
小端字节序:低地址存低位
写段代码判断主机字节序: int a =1 uchar *b= &a
union tmp {int a;uchar b;} tmp.a=1 tmp.b==1
在网络通信中,因为不知道对端主机字节序是大端还是小端,因此两个不同主机字节序的主机在进行通信的时候,就会造成数据二义性
发送的a=0x00000001 对端接收到的数据:0x01000000
字节序对网络通信造成影响 主要针对存储大于一个字节的类型:int8_t int 16_t int 32_t int 64_t short int long float double
为了避免因为主机字节序不同而导致的数据二义 ,因此规定网络通信使用统一字节标准
把这个统一的标准字节序称为网络字节序 (大端字节序)
在编写网络通信程序中,若是大于一个字节类型的数据,就需要考虑字节序的转变
网络编程:
网络通信是两端通信—客户端/服务端 (通信两端总有一方是主动发出请求的)
主动发起请求的一端—客户端
被动接受请求的一端—服务端
永远是客户端先向服务端发送数据
通信中数据需要经过tcp/ip四层 层层封装 每一层都有典型协议 但是传输层有两个:tcp/udp
tcp:传输控制协议—面向连接 可靠传输 提供字节流传输服务—文件/压缩包/可执行程序—安全性
udp:用户数据报协议—无连接 不可靠 面向数据报—允许部分丢包—视频传输—实时性
udp网络通信编程:
1.名称:套接字编程 socket编程
流程:
1.创建套接字:使进程与网卡之间建立联系int socket()
在内核中创建结构体:sovket{…}
2.为套接字绑定地址信息(IP/port(端口))
socket{ doman=…;sip(源地址)=…;sport=…,queue rbuf; queue sbuf;}
3.客户端首先向服务端发送数据
客户端指定一下对端的地址,这时候socket就会将数据从绑定的地址发送出去
服务端通常必须固定一个地址信息 ,不能随意改变
但是客户端的地址可以随意,因为数据发送给服务端,服务端就能获知客户端的地址
4.服务端接收数据
客户端发送的数据到达服务端主机后,服务端操作系统根据这个数据的地址信息,决定将这个数据放到哪一个套接字的缓冲区中(数据有指定进行处理)
服务端通过创建套接字返回的描述符,在内核中华找到套接字结构体,进而从缓冲区中取出数据
5.关闭套接字—释放内核中套接字占据的资源
domain:地址域AF_INET IPV4
type:套接字类型 SOCK_STREAM -流式套接字 tcp
SOCK_DGRAM-数据报套接字 udp
protocol协议:
0-套接字类型默认协议
IPPROTO_TCP—6
IPPROTO_UDP—17
返回值:文件描述符—套接字操作句柄