网络模型
七层模型
四层模型
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;
}
}