错误处理函数:
封装目的:
在server.c编程过程中突出逻辑,将出错处理与逻辑分开,可以直接跳转man手册。
【wrap.c】 【wrap.h】
存放网络通信相关常用 自定义函数 存放 网络通信相关常用 自定义函数原型(声明)。
命名方式:系统调用函数,处理出错场景。
如:Listen()、Accept();
函数功能:调用系统函数,处理出错场景。
在server.c和client.c中调用 自定义函数
联合编译 server.c 和 wrap.c 生成server
client.c 和 wrap.c 生成client
readn:
- 读 N个字节
readline:
- 读一行
多进程并发服务器:server.c
1.Socket(); 创建 监听套接字lfd
2.Bind(); 绑定地址结构Struct sockaddr_in addr;
3.Listen();
4.
while(1)
cfd=Accpet(); 接收客户端连接请求。
pid=fork();
if(pid==0){ 子进程read(cfd)----小-》大——write(cfd)
close(lfd) 关闭用于建立连接的套接字lfd
read()
小---大
write()
}else if (pid>0){
close(cfd); 关闭用于与客户端通信的套接字cfd
contiue;
}
}
5.子进程:
*
close(lfd)
*
read()
*
小--大
*
write()
父进程:
*
close(cfd);
*
注册信号捕捉函数: SIGCHLD
*
在回调函数中,完成子进程回收
*
while(waitpid());
多线程并发服务器:server.c
1.Socket(); 创建 监听套接字lfd
2.Bind(); 绑定地址结构Struct sockaddr_in addr;
3.Listen();
4.
while(1){
cfd=Accept(lfd,);
pthread_create(&tid,NULL,tfn,NULL);
pthread_detach(tid);
}
5.子线程:
void *tfn(void *arg)
{
close(lfd) 不能关闭。主线程要使用lfd
read(cfd)
小--大
write(cfd)
pthread_exit((void*)10);
}