基于TEC传输层的编程模型
服务器端编程模型
- 创建一个用于网络通讯的设备 通讯端点 socket(2)
- 将这个通讯端点和本机的ip地址、端口号绑定 bind(2)
- 在这个通讯端点上监听客户端连接的到来,放入缓冲区队列 listen(2)
- 从缓冲区队列中取出一个客户端连接,返回连接描述符 accept(2)
- 使用连接描述符和客户端通讯 read(2) write(2)
- 关闭连接描述符,终止和客户端的通讯 close(2)
客户端编程模型
- 创建一个用于网络通讯的设备(通讯端点) socket(2)
- 使用这个端点连接到服务器(IP地址和端口号) connet(2)
- 向服务器发送消息
- 等待服务器端的响应消息
- 处理服务器的响应消息
- 关闭设备,结束本次通讯。
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
int listen(int sockfd, int backlog);
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);
int close(int fd);
地址家族的通用结构
struct sockaddr{
sa_family_t sa_family;
char sa_data[14];
};
ipv4的具体地址
man in.h
#include <netinet/in.h>
in_port_t uint16_t
in_addr_t uint32_t
sa_family_t <sys/socket.h>
struct in_addr{
in_addr_t s_addr;
};
struct sockaddr_in{
sa_family_t sin_family; //AF_INET.
in_port_t sin_port; //Port number.
struct in_addr sin_addr; //IP address.
};
本机字节序和网络字节序的转换
#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);