网络模型
七层模型

四层模型

TCP : 面向连接,可靠的,面向字节流,支持点对点通信。
UDP : 无连接,不可靠,面向数据报文,支持一对一,一对多,多对多。
通信原理

常用函数
#include <sys/socket.h>
int socket (int domain, int type, int protocol);
struct sockaddr
{sa_family_t sa_family; char sa_data[14];
};
#include <sys/un.h>
struct sockaddr_un
{sa_family_t sun_family; char sun_path[];
};
#include <netinet/in.h>
struct sockaddr_in
{sa_family_t sin_family;in_port_t sin_port;struct in_addr sin_addr;
};
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);
例子
server
int server_run(){pthread_mutex_init(&lock,NULL);list = slink_create(); file_read(list);
sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd == -1){perror("socket");return -1;}
struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(PORT);addr.sin_addr.s_addr = inet_addr(IP);socklen_t len = sizeof(addr);
int ret = bind(sockfd,(const struct sockaddr *)&addr,len);if(ret == -1){perror("bind");return -1;}
ret = listen(sockfd,MAX);if(ret == -1){perror("listen");return -1;}
while(1){signal(SIGINT,myexit);struct sockaddr_in caddr = {};socklen_t clen = sizeof(caddr);int cfd = accept(sockfd,(struct sockaddr *)&caddr,&clen);if(cfd == -1){perror("accept");return -1;}pthread_t id;int ret = pthread_create(&id,NULL,run,(void*)&cfd);assert(ret == 0);ret = pthread_detach(id);assert(ret == 0);}
}
client
int client_run(){
int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd == -1){perror("socket");return -1;}
struct sockaddr_in addr = {};addr.sin_family = AF_INET;addr.sin_port = htons(PORT);addr.sin_addr.s_addr = inet_addr(IP);socklen_t len = sizeof(addr);
int ret = connect(sockfd,(const struct sockaddr *)&addr,len);if(ret == -1){perror("connect");return -1;}
}