在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); //pthead_join(tid, void**); 新线程--专用于回收子线程。 } 5.子线程: void *tfn(void *arg) { close(lfd) 不能关闭。主线程要使用lfd read(cfd) 小--大 write(cfd) pthread_exit((void*)10); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)