网络编程
tcp协议面向连接(字节流),全双工可靠信道,只能点到点
udp协议面向报文,不可靠,支持多对多
端口号作用:通过端口号区分同一主机多个服务
ftp服务器tcp端口号都是21,Telnet服务器tcp端口号23,TFTP(简单文件传输协议)服务器udp端口号69
字节序
字节序:多字节数据在计算机内存中存储或网络传输时各字节存储顺序
little endian小端字节序:将低序字节存储在起始地址
big endian大端字节序:将高序字节存储在起始地址
网络字节序=大端字节序
socket编程起步
套接字(socket)是网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
socket服务器和客户端开发步骤
- 创建套接字
- 为套接字添加信息(IP和端口号)
- 监听网络连接
- 监听到客户端接入,接入连接
- 数据交互
- 关闭套接字,断开连接
Linux提供的api
int socket(int domain,int type,int protocol)
doman:一般为AF_INET(ipv4因特网域)AF_INET6 (ipv6)
type:SOCKET_STREAM(tcp协议) SOCKET_DGRAM(udp)
protpcol:0 根据前两个参数自动选择传输协议
bind(int socketfd, socketaddr *addr, sizeof(sockaddr_in))
1:套接字描述符
2:结构体指针
struct socket_in
{
sa_family_t sin_family; //协议族
in_port_t sin_port; //端口号(低于3000是操作系统使用的,用户用5000-9000)
struct in_addr sin_addr; //ip地址结构体
unsigned char sin_zero[8]; //填充,没有实际意义,只为和socketaddr结构在内存中对齐,这样两者才能互换
}
地址转换api
htons(8988)
主机字节顺序转变成网络字节顺序
int inet_aton(const char* staddr, struct in_addr *addrp)
功能是将一个字符串IP地址转换为一个32位的网络序列IP地址。
char *inet_ntoa(struct in_addr inaddr)
将网络ip地址转化为字符串形式
监听
listen(int sockfd, int backlog)
2:请求队列中最大长度
连接
accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
2:用来返回已连接的客户端的协议地址
3:客户端地址长度
数据收发
read(),write()
send(),recv()
客户端的connect函数
int connect(int sockfd, const struct aockaddr *addr, socklen_t addrlen)
2:服务器端ip地址和端口号的地址结构指针
3:地址长度常被设为sizeof(struct sockaddr)
cd /usr/include
greap “struct sockaddr_in {” *-nir
n显示行号 i不区分大小写 r递归查找
vi linux/in.h +184 打开到184行
man 2 connect
补全的代码
vi ~/.vim/snippets/c.snippets
71行是一个折叠的代码,zo打开加号,tab #include<stdio.h>