TCP:并发服务器 效率最高 多线程
UDP:循环服务器 不需要listen accept connect
Select(多路复用): 循环服务器
网络编程注意点:
TCP/IP 四层模型 { 应用层,传输层,网络层,网络接口层 }
背三次握手四次挥手
DHCP协议是什么?
套接字 有三种:
- TCP 流套接字 sock_stream
- UDP 数据报套接字 sock_dgram
- 原始套接字
服务器有什么?
- IP 用以在局域网中 找到你的电脑(你就理解成定位系统)
- 端口号 找到对应的软件(比如是发消息给你的电脑 哪个程序来接受消息?
QQ/微信/SKAPE)
Bind / accept 等的第二个参数 需要加强制转换类型
第二个参数 的结构原型:
Struct sockaddr
{
U_short sa_family; //地址族协议
Char sa_data[14]; //存放ip 与 端口号
};
有关端口号: 1-65535 (x shell 中 connecting to 192.168.128.91 : 22这里的22就是端口号)
1-1023 一般不用 被各种协议 占用了
(1)知名端口(Well-Known Ports)
知名端口即众所周知的端口号,范围从0到1023,这些端口号一般固定分配给一些服务。比如21端口分配给FTP服务,25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务,135端口分配给RPC(远程过程调用)服务等等。
(2)动态端口(Dynamic Ports)
动态端口的范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。比如1024端口就是分配给第一个向系统发出申请的程序。在关闭程序进程后,就会释放所占用的端口号。
然后 这个结构慢慢演变了
Struct sockadddr_in
{
Short int sin_family; //internet 地址族
Unsigned short sin_port; //端口号 (自己要指定)
Struct in_addr sin_addr; //IP地址
Unsigned char sin_zero[8]; //填0
};
这里就又涉及到一个知识点:大小端的转换
内存中分为 高地址 和 低地址
而数据又有 高字节 和 低字节
大端:高字节存放在低地址中
小端:低字节存放在低地址中
一般
小端:主机的字节序
大端:网络的字节序
(遇到相关问题和题目 注意平台与电脑键的转换)
有关大小端的转换:
Int a = 1;
A & 0x000000ff << 24 |
A & 0x0000ff00 << 8 |
A & 0x00ff0000 >> 8 |
A & 0xff000000 >>24
将A的左右移位完成大小端的转化
Htonl:(在#include <arpa/inet.h> 头文件中)
H:host 主机
To:
N:网络
L:两个字节 32位
S:一个字节 16位