当前位置: 首页 > news >正文

怎么建设一个属于自己的网站机器人软件开发和网站开发

怎么建设一个属于自己的网站,机器人软件开发和网站开发,网站建设验收单意见怎么写,如东建设网站多进程并发服务器 设计流程 框架一(使用信号回收僵尸进程) void handler(int sig) {while(waitpid(-1, NULL, WNOHANG) > 0); }int main() {//回收僵尸进程siganl(17, handler);//创建服务器监听套接字 serverserver socket();//给服务器地址信息…

多进程并发服务器

设计流程

框架一(使用信号回收僵尸进程)

void handler(int sig)
{while(waitpid(-1, NULL, WNOHANG) > 0);
}int main()
{//回收僵尸进程siganl(17, handler);//创建服务器监听套接字 serverserver = socket();//给服务器地址信息结构体赋值,并绑定bind();//监听指定端口,设置监听队列listen();while(1){//创建与客户端通信的套接字client = accept();//创建子进程if(fork() == 0){//关闭拷贝的服务器套接字close(server);while(1){//接收消息recv();//发送消息send();}//通信结束关闭套接字close(client);//退出进程exit(0);}//关闭父进程的通信套接字close(client);}//服务器关闭close(server);
}

实例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <sys/wait.h>
#include <time.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>#define LOG(s) printf("[%s] {%s:%d} %s \n", __DATE__, __FILE__, __LINE__, s);void cil(int client, struct sockaddr_in caddr);void handler(int sig)
{while(waitpid(-1, NULL, WNOHANG) > 0);
}int main(int argc, char *argv[])
{//回收僵尸进程signal(17, handler);//创建服务器int server = -1;if((server = socket(AF_INET, SOCK_STREAM, 0)) == -1){LOG("socket error");return -1;}//给服务器地址信息结构体赋值,并绑定struct sockaddr_in saddr = {0};saddr.sin_family = AF_INET;saddr.sin_port = htons(8888);saddr.sin_addr.s_addr = htonl(INADDR_ANY);if(bind(server, (struct sockaddr*)&saddr, sizeof(saddr)) == -1){LOG("bind error");return -1;}//监听指定端口,设置监听队列if(listen(server, 5) == -1){LOG("listen error");return -1;}puts("Tcp server start success");int client = -1;struct sockaddr_in caddr = {0};socklen_t len = sizeof(caddr);pid_t pid = -1;while(1){//创建与客户端通信的套接字if((client = accept(server, (struct sockaddr*)&caddr, &len)) == -1){LOG("accpet error");return -1;}printf("[%s/%d] client已上线\n", inet_ntoa(caddr.sin_addr), ntohl(caddr.sin_port));//创建子进程if((pid = fork()) < 0){LOG("fork error");return -1;}else if(pid == 0){cil(client, caddr);exit(0);}close(client);}close(server);return 0;
}void cil(int client, struct sockaddr_in caddr)
{char buf[128] = "";int res = 0;while(1){bzero(buf, sizeof(buf));if((res = read(client, buf, sizeof(buf))) < 0){LOG("read error");break;}else if(res == 0){printf("[%s/%d] client已下线\n", inet_ntoa(caddr.sin_addr), ntohl(caddr.sin_port));close(client);break;}printf("[%s/%d] client: %s\n", inet_ntoa(caddr.sin_addr), ntohl(caddr.sin_port), buf);bzero(buf, sizeof(buf));strcpy(buf, "ok");if(write(client, buf, sizeof(buf)) < 0){LOG("write error");break;}}}

框架二(使用孤儿进程机制避免僵尸进程产生)

int main()
{//创建服务器监听套接字 serverserver = socket();//给服务器地址信息结构体赋值,并绑定bind();//监听指定端口,设置监听队列listen();while(1){//创建子进程if((pid = fork()) == 0){//子进程创建用于与客户端通信的clientclient = accept();//创建孙进程if(pid = fork() == 0){while(1){//孙进程负责与客户端通信recv();send();}//通信结束关闭套接字close(client);//退出进程exit(0);}//子进程else if(pid > 0){//关闭多余的文件描述符close(server);close(client);//退出子进程exit(0);}}//父进程else if(pid > 0){//回收子进程while(waitpid() == pid)}}//关闭文件描述符close(server);
}

实例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <sys/wait.h>
#include <time.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>#define LOG(s) printf("[%s] {%s:%d} %s\n", __DATE__, __FILE__, __LINE__, s);void deal_cil_msg(int client, struct sockaddr_in caddr);int main(int argc, char *argv[])
{//创建服务器socketint server = 0;if((server = socket(AF_INET, SOCK_STREAM, 0)) == -1){LOG("socket error");return -1;}//绑定服务器IP和端口号//给地址信息结构体赋值struct sockaddr_in saddr = {0};saddr.sin_family = AF_INET;saddr.sin_port = htons(8888);saddr.sin_addr.s_addr = htonl(INADDR_ANY);if(bind(server, (struct sockaddr*)&saddr, sizeof(saddr)) == -1){LOG("bind error");return -1;}//监听对应的端口号if(listen(server, 5) == -1){LOG("listen error");return -1;}puts("server start success");//创建用于与客户端通信的socketstruct sockaddr_in caddr = {0};int client = 0;socklen_t asize = sizeof(caddr);pid_t pid = -1;int status = 0;while(1){//父进程只负责生儿子pid = fork();if(pid < 0){LOG("fork error");return -1;}//子进程负责创建通信socketif(pid == 0){//创建用于与客户端通信的socketif((client = accept(server, (struct sockaddr*)&caddr, &asize)) == -1){LOG("accept error");return -1;}printf("[%s/%d]client已上线\n", inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));//孙进程负责通信pid = fork();if(pid < 0){LOG("fork error");return -1;}else if(pid == 0){deal_cil_msg(client, caddr);close(client);exit(0);}else if(pid > 0){close(server);close(client);//退出子进程exit(0);}}else if(pid > 0){printf("wait child = %d\n", pid);//父进程等待子进程结束,准备收尸while(waitpid(pid, &status, 0) == pid){printf("Parent is over - child: %d, status = %x\n", pid, status);}}}//关闭文件描述符close(server);return 0;
}void deal_cil_msg(int client, struct sockaddr_in caddr)
{//接收消息char buf[128] = " ";while(1){int len = 0;bzero(buf, sizeof(buf));if((len = recv(client, buf, sizeof(buf), 0)) < 0){	LOG("recv error");}else if(len == 0){printf("[%s/%d]client已下线\n", inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));break;}printf("[%s/%d]client: %s\n", inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port), buf);bzero(buf, sizeof(buf));//发送消息strcpy(buf, "ok");write(client, buf, len);}}

多线程并发服务器

设计流程

//线程参数结构体
typedef struct
{int client;struct sockaddr_in caddr;
} Client_msg;int main()
{//创建服务器监听套接字 serverserver = socket();//给服务器地址信息结构体赋值,并绑定bind();//监听指定端口,设置监听队列listen();while(1){//创建用于与客户端通信的套接字client = accpet();//创建线程pthread_create();while(1){//读写//关闭文件描述符//退出线程}//解离线程pthread_detach();}//关闭文件描述符close(server);
}

实例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <sys/wait.h>
#include <time.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>#define LOG(s) printf("[%s] {%s:%d} %s \n", __DATE__, __FILE__, __LINE__, s);void* cil(void* arg);//线程参数结构体
typedef struct
{int client;struct sockaddr_in caddr;
} Cli_msg;int main(int argc, char *argv[])
{//创建服务器监听分套接字 serverint server = -1;if((server = socket(AF_INET, SOCK_STREAM, 0)) == -1){LOG("socket error");return -1;}//给服务器地址信息结构体赋值,并绑定struct sockaddr_in saddr = {0};saddr.sin_family = AF_INET;saddr.sin_port = htons(8899);saddr.sin_addr.s_addr = htonl(INADDR_ANY);if(bind(server, (struct sockaddr*)&saddr, sizeof(saddr)) == -1){LOG("bind error");return -1;}//监听端口if(listen(server, 5) == -1){LOG("listen error");return -1;}puts("tcp server start success");struct sockaddr_in caddr = {0};socklen_t len = sizeof(caddr);pthread_t tid = -1;int client = -1;Cli_msg cli_msg;while(1){//创建用于与客户端通信的套接字 clientif((client = accept(server, (struct sockaddr*)&caddr, &len)) == -1){LOG("accept error");return -1;}printf("[%s/%d]client已上线\n", inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));cli_msg.client = client;cli_msg.caddr = caddr;//创建线程if(pthread_create(&tid, NULL, cil, &cli_msg) != 0){LOG("pthread_create error");return -1;}pthread_detach(tid);}close(server);return 0;
}void* cil(void* arg)
{int client = ((Cli_msg*)arg)->client;struct sockaddr_in caddr = ((Cli_msg*)arg)->caddr;char buf[128] = "";int res = 0;while(1){bzero(buf, sizeof(buf));if((res = read(client, buf, sizeof(buf))) < 0){LOG("read error");break;}else if(res == 0){printf("[%s/%d]client已下线\n", inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));close(client);pthread_exit(NULL);}printf("[%s/%d]client: %s\n", inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port), buf);bzero(buf, sizeof(buf));strcpy(buf, "ok");if(write(client, buf, sizeof(buf)) < 0){LOG("write error");break;}}}
http://www.yayakq.cn/news/986534/

相关文章:

  • 网站ui怎么做的福州金山网站建设
  • 湖南省交通建设质量监督站网站wordpress做的外贸网站
  • 网站建设公司-山而承包网站开发
  • 如何编辑做网站大连仟亿科技有限公司
  • 打开自己的网站是别人的域PHP网站开发与管理设计心得
  • 做外汇交易的浏览什么网站软件开发自学网
  • 如何作做网站分销系统设计
  • 装饰公司做网站宣传的是个好处建网站的手机软件
  • 网站的搭建需要多少钱房地产市场调查报告
  • 抚松做网站邯郸网上销售公司
  • pc 手机自适应网站用什么做线上营销推广渠道
  • 电脑网站策划书公司logo设计图片免费下载
  • 网站建设团队介绍蛋糕店网页设计免费模板
  • h5手机网站建设是什么意思asp.net 当前网站
  • 有什么做糕点的视频网站建设银行手机银行登录网站
  • 软件下载网站整站源码郑州网站建设 智巢
  • 大型购物网站建站Wordpress出现错误
  • 网站权重转移做排名淮北论坛官网app
  • 网站建设公司哪个好呀前端页面优化
  • 佛山建站专福州关键词排名优化
  • dw做网站简单首页网页源代码搜索
  • 电子商务网站建设主要内容咸阳市住房和城乡建设规划局网站
  • 多国语言外贸网站模板在哪个网站可以搜画画做品
  • 专业软文发布平台焦作网站seo
  • 最专业的网站建设价格用腾讯云做淘宝客网站视频下载
  • 有网站有安全狗进不去了财务软件免费版
  • 网站推广免费推广网站ppt在线制作网页
  • 济南优化网站厂家网站背景
  • canvas做的手机网站win主机wordpress伪静态
  • 文娱热搜榜关于seo的行业岗位有哪些