***************网络预备知识*********************
Socket
是一个编程接口
是一种特殊的文件描述符 (everything in Unix is a file)
并不仅限于TCP/IP协议
面向连接 (Transmission Control Protocol - TCP/IP)
无连接 (User Datagram Protocol -UDP 和 Inter-network Packet Exchange - IPX)
IP地址
IP地址是Internet中主机的标识
Internet中的主机要与别的机器通信必须具有一个IP地址
端口号
为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区别.
vi /etc/services
TCP端口号与UDP端口号独立
端口号一般由IANA (Internet Assigned Numbers Authority) 管理
众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
已登记端口:1024~49151
动态或私有端口:49152~65535
字节序
0x12345678
不同类型CPU的主机中,内存存储多字节整数序列有两种方法,
称为主机字节序(HBO):
小端序(little-endian) - 低序字节存储在低地址
将低字节存储在起始地址,称为“Little-Endian”字节序,Intel、AMD等采用的是这种方式;
大端序(big-endian)- 高序字节存储在低地址
将高字节存储在起始地址,称为“Big-Endian”字节序,由ARM、Motorola等所采用
网络字节序是大端字节序。
***************转换函数******************************
in_addr_t inet_addr(const char *cp);
功能:将点分十进制的ip字符串,转换为二进制的网络字节序数据。
参数:cp ip字符串
uint16_t htons(uint16_t hostshort);
功能:将无符号短整形主机字节序数据转换为网络字节序数据。
char *inet_ntoa(struct in_addr in);
功能:将网络字节序的二进制数据,转换为 点分十进制的字符串
uint16_t ntohs(uint16_t netshort);
功能:将网络字节序的数据,转换为主机字节序数据
*******************************************************
【1】TCP/IP协议
传输控制/网际协议(Transfer Control Protocol/Internet Protocol) 又称作网络通讯协议
TCP(即传输控制协议):是一种面向连接的传输层协议,
它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)
TCP 客户端编程:
1-- 创建网络套接字
socket();
2-- 填充网络信息结构体
serveraddr.sin_family = AF_INET; //AF_INET 网络通信
serveraddr.sin_addr.s_addr = inet_addr(argv[1]); // ip
serveraddr.sin_port = htons(atoi(argv[2])); //端口号
3--向服务器发起连接请求
connect();
4-- 发送消息
send();
5-- 接收消息
recv();
TCP 服务器编程:
1-- 创建网络套接字
socket();
2-- 填充网络信息结构体
serveraddr.sin_family = AF_INET; //AF_INET 网络通信
serveraddr.sin_addr.s_addr = inet_addr(argv[1]); // ip
serveraddr.sin_port = htons(atoi(argv[2])); //端口号
3-- 绑定套接字
bind();
4--将套接字置为被动监听模式,监听请求的到来
listen();
5--接收客户端的连接请求,返回一个新的网络套接字(专门被用来与相对应的客户端进行通信)
accept();
6-- 接收消息
recv();
7-- 发送消息
send();
【2】UDP 通信
UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以 可以进行高效率的数据传输。
适用情况:
发送小尺寸数据(如对DNS服务器进行IP地址查询时)
在接收到数据,给出应答较困难的网络中使用UDP。(如:无线网络)
适合于广播/组播式通信中。
MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议
流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输
*************************************************************************
标准通信结构体:
struct sockaddr{
sa_family_t sa_family;
char sa_data[14];
}
*************************************************************************
UDP 客户端编程:
1-- 创建网络套接字
socket();
2-- 填充网络信息结构体
serveraddr.sin_family = AF_INET; //AF_INET 网络通信
serveraddr.sin_addr.s_addr = inet_addr(argv[1]); //ip
serveraddr.sin_port = htons(atoi(argv[2])); //端口号
socklen_t addrlen = sizeof(struct sockaddr); //标准信息结构体的大小
3-- 发送消息
sendto();
4-- 接收消息
recvfrom();
UDP 服务器编程:
1-- 创建网络套接字
socket();
2-- 填充网络信息结构体
serveraddr.sin_family = AF_INET; //AF_INET 网络通信
serveraddr.sin_addr.s_addr = inet_addr(argv[1]); //ip
serveraddr.sin_port = htons(atoi(argv[2])); //端口号
3-- 绑定套接字
bind();
4-- 接收消息
recvfrom();
5-- 发送消息
sendto();