文章目录
网络编程
1. 网络通信结构
1.1 Socket网络通信与IPC机制
- IPC
消息队列、共享内存、IPC信号量
结构麻烦、不易使用、仅用于同机进程间通信
- Socket网络通信
标准、规范,基于TCP/IP协议
两种模式:TCP通信(与管道类似)、UDP通信(与消息队列类似)
易于理解、使用,使用广泛
既可用于单机进程间通信,也可用于不同计算机进程间通信
1.2 客户服务器模型
- 与网络通信一般采取客户服务器模型
1.3 网络通信结构
- 分层设计
- 各层分工明确
- 可靠性好,性能高
1.4 套接字编程模型
结构:网卡、TCP协议、套接字(Socket)
类比:网卡(单位门牌号)、TCP/IP协议(收发室)、套接字(信箱号)
套接字:含有进程接收信息的完整地址(Socket地址:IP地址、端口号)
1.5 因特网连接(TCP连接)
TCP连接:比喻连接通信双方套接字的一条通信线路,通信前建立,通信结束拆除
一条TCP连接实际上就是一个文件描述
可用read/write或send/recv进行数据收发
地址:(cliaddr:cliport, servaddr:servport)
1.6 因特网连接实例
服务器端口号:规定为80
客户端端口号:随机分配,12345
2. 套接字地址设置
2.1 地址结构
/* Intenet-style socket address structure */
struct sockaddr_in
{
short sin_family; //指定地址家族即地址格式
unsigned short sin_port; //端口号码
struct in_addr sin_addr; //IP地址
char sin_zero[8]; //需要指定为0
};
在这个结构中,成员sin_family指定使用该套接字地址的地址家族。在这里必须设置为AF_INET,表示程序所使用的地址家族是TCP/IP。
注意:该结构的最后一个成员并未实际使用,主要是为了与第一个版本的套接字地址结构大小相同而设置。在实际使用时,将这8个字节直接设为0即可。
struct sin_addr {
unsigned int s_addr; /*network byte order (big-endian) */
};
2.1.1 字节序
整数:unsigned int B[2]={0x12345678,0xabcdef},
void A=(void) B;
unsigned int *K=(int *)malloc(sizeof(int));
*K=0x12345678;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BK8EzXP9-1590747953341)(F:\markdown\网络编程\1590714503(1)].jpg)
2.1.2 主机序、网络序转换
/*host to network long*/
unsigned long int htonl(unsigned long int hostlong);
/*主机字节序转化为网络字节序*/
unsigned short int htons(unsigned short int hostshort);
返回:按照网络字节顺序的值。
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsiged short int netshort);
h:host
n:network
l:long, int,4字节
s: short, 2字节
#include "wrapper.h"
int main(){
unsigned int m,n; unsigned short k; char *a,*b,*c;
m=0x12345678; n=htonl(0x12345678);
a=(char*)&m; b=(char*