网络编程
进程间通讯 依赖Linux内核 存在功能缺陷:无法多机通讯 ——就要用到网络编程
地址(找到谁)
-
IP地址:标识设备
-
端口:提供访问通道 访问服务
FTP服务器的TCP端口号21
TeLnet服务器TCP端口号23
TFTP服务器UDP端口号69
数据(对话)
- 协议(http,tcp/udp,串口等) 一种数据格式
tcp协议:面向连接 (AB打电话)连接可靠,精细操作
udp协议:面向报文(AB发短信)连接不可靠,数据量大,内存响应快
字节序
字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序
- Little endian 将低序字节存储在起始地址 小端字节序
- Big endian 将高序字节存储在起始地址 大端字节序
网络字节序=大端字节序
x86系列CPU都是小段字节序
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);//返回网络字节序的值
uint16_t htons(uint16_t hostshort);//返回网络字节序的值
uint32_t ntohl(uint32_t netlong);//返回主机字节序的值
uint16_t ntohs(uint16_t netshort);//返回主机字节序的值
Socket套接字 服务器
服务器开发步骤
- 创建套接字
- 为套接字添加信息(IP地址和端口号)
- 监听网络连接
- 监听到有客户端接入,接受一个连接
- 数据交互
- 关闭套接字,断开连接
客户端开发步骤
- 通道
- connect连接
- 数据交互
- 关闭
1.连接协议
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
2.准备地址
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int bind(inct sockfd, const struct sockaddr *addr, socklen_t addrlen);
cd /usr/include/ grep “struct sockaddr_in {” * -nir
地址转换API
int inet_aton(const char* straddr,struct in_addr *addrp);
//把字符串形式的“192.168.1.123”转为网络能识别的格式
char* inet_ntoa(struct in_addr inaddr);
//把网络格式的ip地址转为字符串形式
3.监听
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);
4.连接
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
5.数据收发
另一套API
客户端的connect函数
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);