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

网站弹出公告代码农产品品牌策划方案

网站弹出公告代码,农产品品牌策划方案,seo月薪,广州网站建设公司网站网络的基本概念 TCP/IP协议概述 OSI和TCP/IP模型 socket#xff08;套接字#xff09; 创建socket 字节序 字节序转换函数 通用地址结构 因特网地址结构 IPV4地址族和字符地址间的转换(点分十进制-网络字节序) 填写IPV4地址族结构案例 掌握TCP协议网络基础编程 相关函数 …网络的基本概念 TCP/IP协议概述 OSI和TCP/IP模型 socket套接字 创建socket 字节序 字节序转换函数 通用地址结构 因特网地址结构 IPV4地址族和字符地址间的转换(点分十进制-网络字节序) 填写IPV4地址族结构案例 掌握TCP协议网络基础编程 相关函数 特殊bind地址 案例1:time 先启动一个服务端客户链接上来之后服务端返回一个系统时间 time_tcp_server.c #include stdio.h #includestdlib.h #includenetdb.h #includesys/socket.h #includeunistd.h #includestring.h #includememory.h #includesignal.h #includetime.hint sockfd;void sig_handler(int signo) {if(signoSIGINT){printf(server close\n);/*步骤6* 关闭socket* */close(sockfd);exit(1);} }/*输出连接上来的客户端相关信息* */ void out_addr(struct sockaddr_in *clientaddr) {// 将端口从网络字节序转换成主机字节序int port ntohs(clientaddr-sin_port);char ip[16];memset(ip,0,sizeof(ip));// 网络字节序- 点分十进制inet_ntop(AF_INET,clientaddr-sin_addr.s_addr,ip,sizeof(ip));printf(client:%s(%d) connected \n,ip,port); } void do_service(int fd) {// 获得系统时间long t time(0);char *s ctime(t);size_t size strlen(s)*sizeof(char);// 将服务器端获得的系统时间写到客户端if(write(fd,s,size)!size){perror(write error);} } int main(int argc,char *argv[]) {// 参数服务器端绑定的端口if(argc2){printf(usage :%s #port\n,argv[0]);exit(0);}// 绑定一个信号ctrlc 终止服务端if(signal(SIGINT,sig_handler)SIG_ERR){perror(signal sigint error);exit(1);}/* * 步骤1. 创建socket套接字socket创建在内核,是一个结构体* AF_INET : IPV4* SOCK_STREAM:TCP协议*/sockfd socket(AF_INET,SOCK_STREAM,0);/** 步骤2调用bind函数将socket和地址ip和port进行绑定 * */// 专用地址绑定的时候在强转为通用地址struct sockaddr_in serveraddr; memset(serveraddr,0,sizeof(serveraddr));serveraddr.sin_family AF_INET; // IPV4serveraddr.sin_port htons(atoi(argv[1]));// 字符串- 整型主机字节序-网络字节序serveraddr.sin_addr.s_addr INADDR_ANY;//响应所有请求if(bind(sockfd,(struct sockaddr*)serveraddr,sizeof(serveraddr))0){perror(bind error);exit(1);}/**步骤3调用listen函数启动监听(指定port监听)通知系统去接受来自客户端的连接请求将接受到的客户端连接请求放置到对应的队列中第二个参数10队列的长度* */if(listen(sockfd,10)0){perror(listen error);exit(1);}/**步骤4调用accept函数从队列中获得一个客户端的请求连接* 并返回一个新的socket描述符*注意:若没有客户端连接调用此函数后会阻塞直到获得一个客户端的连接* */struct sockaddr_in clientaddr;socklen_t clientaddr_len sizeof(clientaddr);while(1){// 第二个参数可以设置为NULL,如果不想知道客户端的信息的话int fd accept(sockfd,(struct sockaddr*)clientaddr,clientaddr_len);if(fd0){perror(accept error);continue;}/**步骤5调用IO函数和客户端进行双向的通信*/out_addr(clientaddr);do_service(fd);/*步骤5* 关闭 socket* */ ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d5dcdb3be95a4bbdb7566cb9994daf40.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/24b23c1c7771411493b1380af83b23af.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/910db7d627b54bada7cd3b98047f0cf8.png)- time_tcp_client.cc #includestdio.h #includestdlib.h #includenetdb.h #includesys/socket.h #includeunistd.h #includestring.h #includememory.h #includesignal.h #includetime.hint main(int argc,char *argv[]) {// 参数服务器端绑定的端口if(argc2){printf(usage :%s #port\n,argv[0]);exit(0);}/* * 步骤1. 创建socket套接字socket创建在内核,是一个结构体* AF_INET : IPV4* SOCK_STREAM:TCP协议*/int sockfd socket(AF_INET,SOCK_STREAM,0);if(sockfd0){perror(sockek error);exit(1);}/** 步骤2创建socket* */struct sockaddr_in serveraddr; memset(serveraddr,0,sizeof(serveraddr));serveraddr.sin_family AF_INET; // IPV4serveraddr.sin_port htons(atoi(argv[2]));// 字符串- 整型主机字节序-网络字节序inet_pton(AF_INET,argv[1],serveraddr.sin_addr.s_addr);if(connect(sockfd,(struct sockaddr*)serveraddr,sizeof(serveraddr))0){perror(connect error);exit(1);}// 步骤3调用IO函数和服务器进行双向通讯char buffer[1024];memset(buffer,0,sizeof(buffer));size_t size;if((sizeread(sockfd,buffer,sizeof(buffer)))0){perror(read error);}if(write(STDOUT_FILENO,buffer,size)!size){perror(write error);}// 步骤4关闭socketclose(sockfd);return 0; } 自定义协议 msg.h #ifndef __MSG_H__ #define __MSG_H__ #includesys/types.h typedef struct{// 协议头部char head[10];// 验证码char checknum;//协议体部char buff[512] ;//数据 }MSG; /** 发送一个基于自定义协议的message发送的数据存放在buff中* */ extern int write_msg(int sockfd,char *buff,size_t len); /*读取一个基于自定义协议的message。读取的数据存放在buff中* */ extern int read_msg(int sockfd,char *buff,size_t len);#endif msg.c #includeunistd.h #includestring.h #includememory.h #includesys/types.h #includemsg.h// 计算校验码 static unsigned char msg_check(Msg *message) {unsigned char s 0;for(int i0;isizeof(message-head);i){smessage-head[i];}for(int i0;isizeof(message-buff);i){smessage-buff[i];}return s; }/** 发送一个基于自定义协议的message发送的数据存放在buff中* */int write_msg(int sockfd,char *buff,size_t len) {Msg message;memset(message,0,sizeof(message));strcpy(message.head,iotek2025);memcpy(message.buff,buff,len);message.checknum msg_check(message);if(write(sockfd,message,sizeof(message))!sizeof(message)){return -1;} }/*读取一个基于自定义协议的message。读取的数据存放在buff中* */ int read_msg(int sockfd,char *buff,size_t len) {Msg message;memset(message,0,sizeof(message));size_t size;if((sizeread(sockfd,message,sizeof(message)))0){return -1;}else if(size0){return 0;}// j进行校验码的验证unsigned char s msg_check(message);if((s(unsigned char)message.checknum) (!strcmp(iotek2025,message.head))){memcpy(buff,message.buff,len);return sizeof(message);}return -1; } 在服务端的do_service中增加 void do_service(int fd) { //----------------------------------------size_t len;char buff[20];if((lenread(fd,buff,20))0) // 注意由于客户端没有给服务端写数据所以会在此阻塞{perror(do_service server read error);}//----------------------------------------// 获得系统时间long t time(0);char *s ctime(t);size_t size strlen(s)*sizeof(char);// 将服务器端获得的系统时间写到客户端if(write(fd,s,size)!size){perror(write error);} } 服务器并发性处理 多进程模型 echo_tcp_server #includestdio.h #includestdlib.h #includenetdb.h #includesys/socket.h #includeunistd.h #includestring.h #includememory.h #includesignal.h #includetime.h #includeerrno.h #includemsg.h int sockfd;void sig_handler(int signo) {if(signoSIGINT){printf(server close\n);/*步骤6* 关闭socket* */close(sockfd);exit(1);}if(signoSIGCHLD){printf(child process dead.....\n);wait(0);} }/*输出连接上来的客户端相关信息* */ void out_addr(struct sockaddr_in *clientaddr) {// 将端口从网络字节序转换成主机字节序int port ntohs(clientaddr-sin_port);char ip[16];memset(ip,0,sizeof(ip));// 网络字节序- 点分十进制inet_ntop(AF_INET,clientaddr-sin_addr.s_addr,ip,sizeof(ip));printf(client:%s(%d) connected \n,ip,port); } void do_service(int fd) {// 和客户端进行读写操作(双向通信)char buff[512];while(1){memset(buff,0,sizeof(buff));printf(start read and write....\n);size_t size;if((sizeread_msg(fd,buff,sizeof(buff)))0){perror(protocal error);break;}else if(size0){break; // 写端突然挂了}else{printf(%s\n,buff);if(write_msg(fd,buff,sizeof(buff))0){if(errnoEPIPE)// 读端突然关闭时类似于管道通信{break;}perror(protocal error);}}} } int main(int argc,char *argv[]) {// 参数服务器端绑定的端口if(argc2){printf(usage :%s #port\n,argv[0]);exit(0);}// 绑定一个信号ctrlc 终止服务端if(signal(SIGINT,sig_handler)SIG_ERR){perror(signal sigint error);exit(1);}if(signal(SIGCHLD,sig_handler)SIG_ERR)// 等子进程终止发送的信号{perror(signal sigchild error);exit(1);}/* * 步骤1. 创建socket套接字socket创建在内核,是一个结构体* AF_INET : IPV4* SOCK_STREAM:TCP协议*/sockfd socket(AF_INET,SOCK_STREAM,0);if(sockfd0){perror(sockek error);exit(1);}/** 步骤2调用bind函数将socket和地址ip和port进行绑定 * */// 专用地址绑定的时候在强转为通用地址struct sockaddr_in serveraddr; memset(serveraddr,0,sizeof(serveraddr));serveraddr.sin_family AF_INET; // IPV4serveraddr.sin_port htons(atoi(argv[1]));// 字符串- 整型主机字节序-网络字节序serveraddr.sin_addr.s_addr INADDR_ANY;//响应所有请求if(bind(sockfd,(struct sockaddr*)serveraddr,sizeof(serveraddr))0){perror(bind error);exit(1);}/**步骤3调用listen函数启动监听(指定port监听)通知系统去接受来自客户端的连接请求将接受到的客户端连接请求放置到对应的队列中第二个参数10队列的长度* */if(listen(sockfd,10)0){perror(listen error);exit(1);}/**步骤4调用accept函数从队列中获得一个客户端的请求连接* 并返回一个新的socket描述符*注意:若没有客户端连接调用此函数后会阻塞直到获得一个客户端的连接* */struct sockaddr_in clientaddr;socklen_t clientaddr_len sizeof(clientaddr);while(1){// 第二个参数可以设置为NULL,如果不想知道客户端的信息的话int fd accept(sockfd,(struct sockaddr*)clientaddr,clientaddr_len);if(fd0){perror(accept error);continue;}/**步骤5启动子进程调用IO函数 */pid_t pid fork();if(pid0){continue;}else if(pid0){out_addr(clientaddr);do_service(fd);/*步骤6:* 关闭 socket* */close(fd); /// 子进程会复制父进程的fd}else{close(fd); }}return 0; } echo_tcp_client.c #includestdio.h #includestdlib.h #includenetdb.h #includesys/socket.h #includeunistd.h #includestring.h #includememory.h #includesignal.h #includetime.h #includeerrno.h #includemsg.hint main(int argc,char *argv[]) {// 参数服务器端绑定的端口if(argc2){printf(usage :%s #port\n,argv[0]);exit(0);}/* * 步骤1. 创建socket套接字socket创建在内核,是一个结构体* AF_INET : IPV4* SOCK_STREAM:TCP协议*/int sockfd socket(AF_INET,SOCK_STREAM,0);if(sockfd0){perror(sockek error);exit(1);}/** 步骤2创建socket* */struct sockaddr_in serveraddr; memset(serveraddr,0,sizeof(serveraddr));serveraddr.sin_family AF_INET; // IPV4serveraddr.sin_port htons(atoi(argv[2]));// 字符串- 整型主机字节序-网络字节序inet_pton(AF_INET,argv[1],serveraddr.sin_addr.s_addr);if(connect(sockfd,(struct sockaddr*)serveraddr,sizeof(serveraddr))0){perror(connect error);exit(1);}// 步骤3调用IO函数和服务器进行双向通讯char buff[512];size_t size;char * prompt ;while(1){memset(buff,0,sizeof(buff));write(STDOUT_FILENO,prompt,1);size read(STDIN_FILENO,buff,sizeof(buff));if(size0) {continue;}buff[size-1] \0;if(write_msg(sockfd,buff,sizeof(buff))0){perror(write msg error);continue;}else{if(read_msg(sockfd,buff,sizeof(buff))0){perror(read msg error);continue;}else{printf(%s\n,buff);}}}// 步骤4关闭socketclose(sockfd);return 0; } 下面这个没有出现 多线程模型 ehco_tcp_server_th.c #includestdio.h #includestdlib.h #includenetdb.h #includesys/socket.h #includeunistd.h #includestring.h #includememory.h #includesignal.h #includetime.h #includeerrno.h #includesys/types.h #includesys/wait.h #includepthread.h #includemsg.hint sockfd;void sig_handler(int signo) {if(signoSIGINT){printf(server close\n);/*步骤6* 关闭socket* */close(sockfd);exit(1);} }void do_service(int fd) {// 和客户端进行读写操作(双向通信)char buff[512];while(1){memset(buff,0,sizeof(buff));printf(start read and write....\n);size_t size;if((sizeread_msg(fd,buff,sizeof(buff)))0){perror(protocal error);break;}else if(size0){break; // 写端突然挂了}else{printf(%s\n,buff);if(write_msg(fd,buff,sizeof(buff))0){if(errnoEPIPE)// 读端突然关闭时类似于管道通信{break;}perror(protocal error);}}} }void out_fd(int fd) {struct sockaddr_in addr;socklen_t len sizeof(addr);// 从fd中获得连接的客户端的相关信息if(getpeername(fd,(struct sockaddr*)addr,len)0){perror(getpeername error);return;}char ip[16];memset(ip,0,sizeof(ip));int port ntohs(addr.sin_port);inet_ntop(AF_INET,addr.sin_addr.s_addr,ip,sizeof(ip));printf(%16s(%5d) closed\n,ip,port); }void * th_fn(void *arg) {int fd (int)arg;do_service(fd);out_fd(fd);// 输出客户端的信息close(fd);return (void*)0; }int main(int argc,char *argv[]) {// 参数服务器端绑定的端口if(argc2){printf(usage :%s #port\n,argv[0]);exit(0);}// 绑定一个信号ctrlc 终止服务端if(signal(SIGINT,sig_handler)SIG_ERR){perror(signal sigint error);exit(1);}/* * 步骤1. 创建socket套接字socket创建在内核,是一个结构体* AF_INET : IPV4* SOCK_STREAM:TCP协议*/sockfd socket(AF_INET,SOCK_STREAM,0);if(sockfd0){perror(sockek error);exit(1);}/** 步骤2调用bind函数将socket和地址ip和port进行绑定 * */// 专用地址绑定的时候在强转为通用地址struct sockaddr_in serveraddr; memset(serveraddr,0,sizeof(serveraddr));serveraddr.sin_family AF_INET; // IPV4serveraddr.sin_port htons(atoi(argv[1]));// 字符串- 整型主机字节序-网络字节序serveraddr.sin_addr.s_addr INADDR_ANY;//响应所有请求if(bind(sockfd,(struct sockaddr*)serveraddr,sizeof(serveraddr))0){perror(bind error);exit(1);}/**步骤3调用listen函数启动监听(指定port监听)通知系统去接受来自客户端的连接请求将接受到的客户端连接请求放置到对应的队列中第二个参数10队列的长度* */if(listen(sockfd,10)0){perror(listen error);exit(1);}/**步骤4调用accept函数从队列中获得一个客户端的请求连接* 并返回一个新的socket描述符*注意:若没有客户端连接调用此函数后会阻塞直到获得一个客户端的连接* */struct sockaddr_in clientaddr;socklen_t clientaddr_len sizeof(clientaddr);// 设置线程的分离属性pthread_attr_t attr;pthread_attr_init(attr);pthread_attr_setdetachstate(attr,PTHREAD_CREATE_DETACHED);while(1){// 第二个参数可以设置为NULL,如果不想知道客户端的信息的话// 主控线程负责调用accept去获得客户端的连接 int fd accept(sockfd,NULL,NULL);if(fd0){perror(accept error);continue;}/**步骤5启动子线程调用IO函数 */pthread_t th;int err;// 以分离状态启动子线程if((errpthread_create(th,attr,th_fn,(void*)fd))!0){perror(pthread create error);}pthread_attr_destroy(attr);}return 0; } I/O多路转换(select) 掌握UDP协议网络基础编程 发生数据 接收数据 time_udp_server #include stdio.h #includesys/socket.h #includeunistd.h #includestring.h #includestdlib.h #includesignal.h #includetime.h #includenetdb.hint sockfd;void sig_handler(int signo) {if(signoSIGINT){printf(server close\n);close(sockfd);exit(1);}}// 输出客户端的信息 void out_addr(struct sockaddr_in *clientaddr) {char ip[16];memset(ip,0,sizeof(ip));inet_ntop(AF_INET,clientaddr-sin_addr.s_addr,ip,sizeof(ip));int port ntohs(clientaddr-sin_port);printf(client : %s(%d)\n,ip,port); }// 和客户端进行通信 void do_service() {struct sockaddr_in clientaddr;socklen_t len sizeof(clientaddr);char buffer[1024];memset(buffer,0,sizeof(buffer));// 接受客户端的数据报文if(recvfrom(sockfd,buffer,sizeof(buffer),0,(struct sockaddr*)clientaddr,len)0){perror(recvfrom error);}else{out_addr(clientaddr);printf(client send into : %s\n,buffer);//向客户端发送数据报文long int t time(0);char * ptr ctime(t);size_t size strlen(ptr)*sizeof(char);if(sendto(sockfd,ptr,size,0,(struct sockaddr*)clientaddr,len)0){perror(sendto error);}}} int main(int argc,char *argv[]) {if(argc0){printf(usage : %s port \n,argv[0]);exit(1);}if(signal(SIGINT,sig_handler)SIG_ERR){perror(signal sigint error);exit(1);}/*步骤1** */sockfd socket(AF_INET,SOCK_DGRAM,0);if(sockfd0){perror(sockfd error);exit(1);}int res;int opt 1;// 设置套接字选项:让刚才实现的端口立即启动if((ressetsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,opt,sizeof(opt)))0){perror(setsockopt error);exit(1);}/*步骤2:调用bind函数对socket和地址进行绑定* */struct sockaddr_in serveraddr;memset(serveraddr,0,sizeof(serveraddr));serveraddr.sin_family AF_INET; // IPV4serveraddr.sin_port htons(atoi(argv[1])); // portserveraddr.sin_addr.s_addr INADDR_ANY; //ipif(bind(sockfd,(struct sockaddr*)serveraddr,sizeof(serveraddr))0){perror(bind error);exit(1);}/*步骤3和客户端进行双向的数据通信* */while(1){do_service();}return 0; } time_udp_client #include stdio.h #includestdlib.h #includestring.h #includenetdb.h #includesys/socket.h #includememory.h #includeunistd.hint main(int argc,char *argv[]) {if(argc3){printf(usgae : %s ip port \n,argv[0]);exit(1);}/*步骤1创建socket* */int sockfd socket(AF_INET,SOCK_DGRAM,0);if(sockfd0){perror(socket error);exit(1);}/*步骤2调用recvfrom和sendto等函数* 和服务器进行双向通信* */struct sockaddr_in serveraddr;memset(serveraddr,0,sizeof(serveraddr));serveraddr.sin_family AF_INET;serveraddr.sin_port htons(atoi(argv[2]));inet_pton(AF_INET,argv[1],serveraddr.sin_addr.s_addr); //ipchar buffer[1024] hello iotek;// 向服务器端发送数据报文if(sendto(sockfd,buffer,sizeof(buffer),0,(struct sockaddr*)serveraddr,sizeof(serveraddr))0){perror(sendto error);exit(1);}else{//接受服务器发送的报文memset(buffer,0,sizeof(buffer));if(recv(sockfd,buffer,sizeof(buffer),0)0){perror(recv error);exit(1);}else{printf(%s,buffer);}close(sockfd);}return 0; } 在客户端可以使用connect进行连接 这里的connect并没有和服务端进行三次握手只是在内核中记录了服务端的地址信息和端口所以可以直接使用send不用指出服务端的地址等信息了。而且调用connect可以保证只是接受来自服务端发送的数据不接受其他的信息 多次绑定同一个端口 第二个端口起作用 域名 gethostent获取所有 gethostbuname获取某一个 在Linux中的位于/etc/hosts gethost.c #include stdio.h #includenetdb.h #includestdlib.h #includememory.hvoid out_addr(struct hostent *h) {printf(hostbyname: %s\n,h-h_name);printf(addrtype: %s\n,h-h_addrtypeAF_INET ? IPV4 : IPV6);char ip[16];memset(ip,0,sizeof(ip));inet_ntop(h-h_addrtype,h-h_addr_list[0],ip,sizeof(ip));printf(ip addrress : %s\n,ip);int i 0;while(h-h_aliases[i] ! NULL){printf(alias : %s \n,h-h_aliases[i]);i;} }int main(int argc,char *argv[]) {if(argc2){printf(usage %s host \n,argv[0]);exit(1);}struct hostent *h;h gethostbyname(argv[1]);if(h!NULL){out_addr(h);}else{printf(no %s exits\n,argv[1]);}return 0;endhostent(); } 注意gethostbyname应该避免在多线程下使用。 使用gethostent #include stdio.h #includenetdb.h #includestdlib.h #includememory.hvoid out_addr(struct hostent *h) {printf(hostbyname: %s\n,h-h_name);printf(addrtype: %s\n,h-h_addrtypeAF_INET ? IPV4 : IPV6);char ip[16];memset(ip,0,sizeof(ip));inet_ntop(h-h_addrtype,h-h_addr_list[0],ip,sizeof(ip));printf(ip addrress : %s\n,ip);int i 0;while(h-h_aliases[i] ! NULL){printf(alias : %s \n,h-h_aliases[i]);i;} }int main(int argc,char *argv[]) {if(argc2){printf(usage %s host \n,argv[0]);exit(1);}struct hostent *h;while((hgethostent()) ! NULL){if(!strcmp(argv[1],h-h_name)){out_addr(h);exit(0);}else{int i 0;while(h-h_aliases[i] ! NULL){if(!strcmp(argv[1],h-h_aliases[i])){out_addr(h);exit(0);}i;}}}endhostent();return 0; } #include stdio.h #includestdlib.h #includestring.h #includenetdb.h #includesys/socket.h #includememory.h #includeunistd.hint is_host(struct hostent *host,char *name) {if(!strcmp(host-h_name,name))return 1;int i 0;while(host-h_aliases[i] ! NULL){if(!strcmp(host-h_aliases[i],name))return 1;i;} } unsigned int get_ip_by_name(char *name) {unsigned int ip 0;struct hostent *host;while((host gethostent())!NULL){if(is_host(host,name)){memcpy(ip,host-h_addr_list[0],4);break;}}endhostent();return ip; }int main(int argc,char *argv[]) {if(argc3){printf(usgae : %s ip port \n,argv[0]);exit(1);}/*步骤1创建socket* */int sockfd socket(AF_INET,SOCK_DGRAM,0);if(sockfd0){perror(socket error);exit(1);}/*步骤2调用recvfrom和sendto等函数* 和服务器进行双向通信* */struct sockaddr_in serveraddr;memset(serveraddr,0,sizeof(serveraddr));serveraddr.sin_family AF_INET;serveraddr.sin_port htons(atoi(argv[2]));unsigned int ip get_ip_by_name(argv[1]);if(ip!0){serveraddr.sin_addr.s_addr ip;}else{inet_pton(AF_INET,argv[1],serveraddr.sin_addr.s_addr);}//inet_pton(AF_INET,argv[1],serveraddr.sin_addr.s_addr); //ipchar buffer[1024] hello iotek;// 向服务器端发送数据报文if(sendto(sockfd,buffer,sizeof(buffer),0,(struct sockaddr*)serveraddr,sizeof(serveraddr))0){perror(sendto error);exit(1);}else{//接受服务器发送的报文memset(buffer,0,sizeof(buffer));if(recv(sockfd,buffer,sizeof(buffer),0)0){perror(recv error);exit(1);}else{printf(%s,buffer);}close(sockfd);}return 0; } 网络高级编程 广播 套接字选项 TCP不支持广播只有UDP才能支持广播 缓存区 receiver.c #include stdio.h #includenetdb.h #includesys/socket.h #includestring.h #includesignal.h #includestdlib.hint sockfd;void sig_handler(int signo) {if(signo SIGINT){printf(receiver will exited);close(sockfd);exit(1);} }int main(int argc,char *argv[]) {if(argc2){fprintf(stderr,usage : %s port \n,argv[0]);exit(1);}if(signal(SIGINT,sig_handler)SIG_ERR){perror(signal sigint errro);exit(1);}sockfd socket(AF_INET,SOCK_DGRAM,0);if(sockfd0){perror(socket error);exit(1);}struct sockaddr_in serveraddr;memset(serveraddr,0,sizeof(serveraddr));serveraddr.sin_family AF_INET;serveraddr.sin_port htons(atoi(argv[1]));serveraddr.sin_addr.s_addr INADDR_ANY;if(bind(sockfd,(struct sockadd*)serveraddr,sizeof(serveraddr))0){perror(bind error);exit(1);}char buffer[1024];struct sockaddr_in clientaddr;socklen_t len sizeof(clientaddr);while(1){memset(buffer,0,sizeof(buffer));memset(clientaddr,0,sizeof(clientaddr));if(recvfrom(sockfd,buffer,sizeof(buffer),0,(struct sockaddr*)clientaddr,len)0){perror(recvfrom error);exit(1);}else{char ip[16];inet_ntop(AF_INET,clientaddr.sin_addr.s_addr,ip,sizeof(ip));int port ntohs(clientaddr.sin_port); printf(%s{%d}:%s\n,ip,port,buffer);}}return 0; } broadcast.c #include stdio.h #includestdlib.h #includestring.h #includenetdb.h #includesys/socket.hint main(int argc,char * argv[]) {if(argc3){fprintf(stderr,usage: %s ip port\n,argv[0]);exit(1);}int sockfd socket(AF_INET,SOCK_DGRAM,0);if(sockfd0){perror(sockdt error);exit(1);}int opt 1;// 采用广播地址发送setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,opt,sizeof(opt));struct sockaddr_in serveraddr;memset(serveraddr,0,sizeof(serveraddr));serveraddr.sin_family AF_INET;serveraddr.sin_port htons(atoi(argv[2]));inet_pton(AF_INET,argv[1],serveraddr.sin_addr.s_addr);printf(I will broadcast....\n);char *info helo yangpipi...;size_t size strlen(info)*sizeof(char);if(sendto(sockfd,info,size,0,(struct sockaddr*)serveraddr,sizeof(serveraddr))0){perror(sendto error);exit(1);}else{printf(boradcast success\n);}close(sockfd);return 0; 多路复用之fcntl server.c #includestdio.h #includestdlib.h #includenetdb.h #includesys/socket.h #includeunistd.h #includestring.h #includememory.h #includesignal.h #includetime.h #includeerrno.h #includesys/types.h #includesys/wait.h #includepthread.h #includefcntl.h #includevector_fd.hVectorFD *vfd; int sockfd;void sig_handler(int signo) {if(signoSIGINT){printf(server close----\n);/*步骤6* 关闭socket* */close(sockfd);// 销毁动态数组destroy_vector_fd(vfd);exit(1);} }/**fd对应于某个连接的客户端和某个连接的客户端进行双向通信非阻塞方式* */ void do_service(int fd) {// 和客户端进行读写操作(双向通信)char buff[512];while(1){memset(buff,0,sizeof(buff));// 以非阻塞方式读读不到数据就返回了直接服务于下一个客户端因此不需要判断size0的情况size_t sizeread(fd,buff,sizeof(buff));if(size0){char info[] client closed;write(STDOUT_FILENO,info,sizeof(info));// 从动态数组中删除对应的fdremove_fd(vfd,fd);// 关闭对应的客户端的socketclose(fd);}else if(size 0){write(STDOUT_FILENO,buff,sizeof(buff));if(write(fd,buff,size)size){if(errnoEPIPE)// 客户端关闭连接{perror(write error);remove_fd(vfd,fd);close(fd);}}}} }void * th_fn(void *arg) {int i;while(1){// 遍历动态数中的socket描述符for(int i 0;ivfd-counter;i){do_service(get_fd(vfd,i));}}return (void*)0; }void out_addr(struct sockaddr_in *clientaddr) {char ip[16];memset(ip,0,sizeof(ip));int port ntohs(clientaddr-sin_port);inet_ntop(AF_INET,clientaddr-sin_addr.s_addr,ip,sizeof(ip));printf(%s(%d) connected!\n,ip,port); } int main(int argc,char *argv[]) {// 参数服务器端绑定的端口if(argc2){printf(usage :%s #port\n,argv[0]);exit(0);}// 绑定一个信号ctrlc 终止服务端if(signal(SIGINT,sig_handler)SIG_ERR){perror(signal sigint error);exit(1);}/* * 步骤1. 创建socket套接字socket创建在内核,是一个结构体* AF_INET : IPV4* SOCK_STREAM:TCP协议*/sockfd socket(AF_INET,SOCK_STREAM,0);if(sockfd0){perror(sockek error);exit(1);}/** 步骤2调用bind函数将socket和地址ip和port进行绑定 * */// 专用地址绑定的时候在强转为通用地址struct sockaddr_in serveraddr; memset(serveraddr,0,sizeof(serveraddr));serveraddr.sin_family AF_INET; // IPV4serveraddr.sin_port htons(atoi(argv[1]));// 字符串- 整型主机字节序-网络字节序serveraddr.sin_addr.s_addr INADDR_ANY;//响应所有请求if(bind(sockfd,(struct sockaddr*)serveraddr,sizeof(serveraddr))0){perror(bind error);exit(1);}/**步骤3调用listen函数启动监听(指定port监听)通知系统去接受来自客户端的连接请求将接受到的客户端连接请求放置到对应的队列中第二个参数10队列的长度* */if(listen(sockfd,10)0){perror(listen error);exit(1);}/**步骤4调用accept函数从队列中获得一个客户端的请求连接* 并返回一个新的socket描述符*注意:若没有客户端连接调用此函数后会阻塞直到获得一个客户端的连接* */// 创建放置套接字描述符fd的动态数组vfd create_vector_fd();// 设置线程的分离属性pthread_attr_t attr;pthread_attr_init(attr);pthread_attr_setdetachstate(attr,PTHREAD_CREATE_DETACHED);int err;pthread_t th; if((errpthread_create(th,attr,th_fn,(void*)0))!0){perror(pthread create error);exit(1);}pthread_attr_destroy(attr);/** 1) 主控线程获得客户端的连接将新的socket描述符放置到动态数组中* 2) 启动的子线程负责遍历动态数组中socket描述符并和对应的客户端进行双向通信(采用非阻塞方式读写)** */struct sockaddr_in clientaddr;socklen_t clientaddr_len sizeof(clientaddr);while(1){int fd accept(sockfd,(struct sockaddr*)clientaddr,clientaddr_len);if(fd0){perror(accept error);continue;}out_addr(clientaddr);// 将读写方式修改为非阻塞方式int val;fcntl(fd,F_GETFL,val);val | O_NONBLOCK;fcntl(fd,F_SETFL,val); // 将返回新的socket描述符加入到动态数组中add_fd(vfd,fd);}return 0; client.c #includestdio.h #includestdlib.h #includenetdb.h #includesys/socket.h #includeunistd.h #includestring.h #includememory.h #includesignal.h #includetime.h #includeerrno.hint main(int argc,char *argv[]) {// 参数服务器端绑定的端口if(argc2){printf(usage :%s #port\n,argv[0]);exit(0);}/* * 步骤1. 创建socket套接字socket创建在内核,是一个结构体* AF_INET : IPV4* SOCK_STREAM:TCP协议*/int sockfd socket(AF_INET,SOCK_STREAM,0);if(sockfd0){perror(sockek error);exit(1);}/** 步骤2创建socket* */struct sockaddr_in serveraddr; memset(serveraddr,0,sizeof(serveraddr));serveraddr.sin_family AF_INET; // IPV4serveraddr.sin_port htons(atoi(argv[2]));// 字符串- 整型主机字节序-网络字节序inet_pton(AF_INET,argv[1],serveraddr.sin_addr.s_addr);if(connect(sockfd,(struct sockaddr*)serveraddr,sizeof(serveraddr))0){perror(connect error);exit(1);}// 步骤3调用IO函数和服务器进行双向通讯char buff[512];size_t size;char * prompt ;while(1){memset(buff,0,sizeof(buff));write(STDOUT_FILENO,prompt,1);size read(STDIN_FILENO,buff,sizeof(buff));if(size0) {continue;}buff[size-1] \0;if(write(sockfd,buff,sizeof(buff))0){perror(write msg error);continue;}else{if(read(sockfd,buff,sizeof(buff))0){perror(read msg error);continue;}else{printf(%s\n,buff);}}}// 步骤4关闭socketclose(sockfd);return 0; } 多路复用之select echo_tcp_sever_select.c #includestdio.h #includestdlib.h #includenetdb.h #includesys/socket.h #includeunistd.h #includestring.h #includememory.h #includesignal.h #includetime.h #includeerrno.h #includesys/types.h #includesys/wait.h #includepthread.h #includefcntl.h #includevector_fd.hVectorFD *vfd; int sockfd;void sig_handler(int signo) {if(signoSIGINT){printf(server close----\n);/*步骤6* 关闭socket* */close(sockfd);// 销毁动态数组destroy_vector_fd(vfd);exit(1);} }/**fd对应于某个连接的客户端和某个连接的客户端进行双向通信非阻塞方式* */ void do_service(int fd) {// 和客户端进行读写操作(双向通信)char buff[512];while(1){memset(buff,0,sizeof(buff));// 以非阻塞方式读读不到数据就返回了直接服务于下一个客户端因此不需要判断size0的情况size_t sizeread(fd,buff,sizeof(buff));if(size0){//char info[] client closed;//write(STDOUT_FILENO,info,sizeof(info));printf(client closed\n); // 这里由于内核设置所以可以使用带缓存的IO// 从动态数组中删除对应的fdremove_fd(vfd,fd);// 关闭对应的客户端的socketclose(fd);}else if(size 0){//write(STDOUT_FILENO,buff,sizeof(buff));printf(%s\n,buff);if(write(fd,buff,size)size){if(errnoEPIPE)// 客户端关闭连接{perror(write error);remove_fd(vfd,fd);close(fd);}}}} }/*遍历出动态数组中所有的描述符并加入到描述符集set中* 同时此函数返回动态数组中最大的那个描述符* */ int add_set(fd_set *set) {FD_ZERO(set); // 清空描述符int max_fd vfd-fd[0];for(int i 0;i vfd-fd[0];i){int fd get_fd(vfd,i);if(fdmax_fd){max_fd fd;}FD_SET(fd,set);//将fd加入到描述符集中}return max_fd; } void * th_fn(void *arg) {struct timeval t;t.tv_sec 2;t.tv_usec 0;int n 0;int maxfd;fd_set set; // 描述符集maxfd add_set(set);/*调用select函数会阻塞委托内核去检查传入的描述符是否准备好* 如有则返回准备好的描述符* 超时则返回0* 第一个参数为描述符集中描述符的范围(最大描述符1)* */while((nselect(maxfd1,set,NULL,NULL,t))0){if(n0){/*检测那些描述符准备好并和这些准备好的描述符对应的客户端进行数据的双向通信* */for(int i0;ivfd-counter;i){int fd get_fd(vfd,i);if(FD_ISSET(fd,set)){do_service(fd);}}}//超时// 重新设置时间和清空描述符集t.tv_sec 2;t.tv_usec 0;// 重新遍历动态数组中最新的描述符放置到描述符集中maxfd add_set(set);} }void out_addr(struct sockaddr_in *clientaddr) {char ip[16];memset(ip,0,sizeof(ip));int port ntohs(clientaddr-sin_port);inet_ntop(AF_INET,clientaddr-sin_addr.s_addr,ip,sizeof(ip));printf(%s(%d) connected!\n,ip,port); } int main(int argc,char *argv[]) {// 参数服务器端绑定的端口if(argc2){printf(usage :%s #port\n,argv[0]);exit(0);}// 绑定一个信号ctrlc 终止服务端if(signal(SIGINT,sig_handler)SIG_ERR){perror(signal sigint error);exit(1);}/* * 步骤1. 创建socket套接字socket创建在内核,是一个结构体* AF_INET : IPV4* SOCK_STREAM:TCP协议*/sockfd socket(AF_INET,SOCK_STREAM,0);if(sockfd0){perror(sockek error);exit(1);}/** 步骤2调用bind函数将socket和地址ip和port进行绑定 * */// 专用地址绑定的时候在强转为通用地址struct sockaddr_in serveraddr; memset(serveraddr,0,sizeof(serveraddr));serveraddr.sin_family AF_INET; // IPV4serveraddr.sin_port htons(atoi(argv[1]));// 字符串- 整型主机字节序-网络字节序serveraddr.sin_addr.s_addr INADDR_ANY;//响应所有请求if(bind(sockfd,(struct sockaddr*)serveraddr,sizeof(serveraddr))0){perror(bind error);exit(1);}/**步骤3调用listen函数启动监听(指定port监听)通知系统去接受来自客户端的连接请求将接受到的客户端连接请求放置到对应的队列中第二个参数10队列的长度* */if(listen(sockfd,10)0){perror(listen error);exit(1);}/**步骤4调用accept函数从队列中获得一个客户端的请求连接* 并返回一个新的socket描述符*注意:若没有客户端连接调用此函数后会阻塞直到获得一个客户端的连接* */// 创建放置套接字描述符fd的动态数组vfd create_vector_fd();// 设置线程的分离属性pthread_attr_t attr;pthread_attr_init(attr);pthread_attr_setdetachstate(attr,PTHREAD_CREATE_DETACHED);int err;pthread_t th; if((errpthread_create(th,attr,th_fn,(void*)0))!0){perror(pthread create error);exit(1);}pthread_attr_destroy(attr);/** 1) 主控线程获得客户端的连接将新的socket描述符放置到动态数组中* 2) * a) 启动的子线程调用select函数委托内核去检查传入到select中的描述符是否准备好* b) 利用FD_ISSET来找出准备好的那些描述符并和对应的客户端进行双向通信(非阻塞)** */struct sockaddr_in clientaddr;socklen_t clientaddr_len sizeof(clientaddr);while(1){int fd accept(sockfd,(struct sockaddr*)clientaddr,clientaddr_len);if(fd0){perror(accept error);continue;}out_addr(clientaddr);// 将返回新的socket描述符加入到动态数组中add_fd(vfd,fd);}return 0; } 守护进程 编程步骤 出错处理 #includestdio.h #includestdlib.h #includenetdb.h #includesys/socket.h #includeunistd.h #includestring.h #includememory.h #includesignal.h #includetime.h #includeerrno.h #includesys/types.h #includesys/wait.h #includepthread.h #includefcntl.h #includesyslog.h #includesys/stat.h #includevector_fd.hVectorFD *vfd; int sockfd;/**fd对应于某个连接的客户端和某个连接的客户端进行双向通信非阻塞方式* */ void do_service(int fd) {// 和客户端进行读写操作(双向通信)char buff[512];while(1){memset(buff,0,sizeof(buff));// 以非阻塞方式读读不到数据就返回了直接服务于下一个客户端因此不需要判断size0的情况size_t sizeread(fd,buff,sizeof(buff));if(size0){char info[] client closed\n;syslog(LOG_DEBUG,client closed);//printf(client closed\n); // 这里由于内核设置所以可以使用带缓存的IO// 从动态数组中删除对应的fdremove_fd(vfd,fd);// 关闭对应的客户端的socketclose(fd);}else if(size 0){//write(STDOUT_FILENO,buff,sizeof(buff));// printf(%s\n,buff);syslog(LOG_DEBUG,%s\n,buff);if(write(fd,buff,size)size){if(errnoEPIPE)// 客户端关闭连接{syslog(LOG_DEBUG,write:%s\n,strerror(errno));remove_fd(vfd,fd);close(fd);}}}} }/*遍历出动态数组中所有的描述符并加入到描述符集set中* 同时此函数返回动态数组中最大的那个描述符* */ int add_set(fd_set *set) {FD_ZERO(set); // 清空描述符int max_fd vfd-fd[0];for(int i 0;i vfd-fd[0];i){int fd get_fd(vfd,i);if(fdmax_fd){max_fd fd;}FD_SET(fd,set);//将fd加入到描述符集中}return max_fd; } void * th_fn(void *arg) {struct timeval t;t.tv_sec 2;t.tv_usec 0;int n 0;int maxfd;fd_set set; // 描述符集maxfd add_set(set);/*调用select函数会阻塞委托内核去检查传入的描述符是否准备好* 如有则返回准备好的描述符* 超时则返回0* 第一个参数为描述符集中描述符的范围(最大描述符1)* */while((nselect(maxfd1,set,NULL,NULL,t))0){if(n0){/*检测那些描述符准备好并和这些准备好的描述符对应的客户端进行数据的双向通信* */for(int i0;ivfd-counter;i){int fd get_fd(vfd,i);if(FD_ISSET(fd,set)){do_service(fd);}}}//超时// 重新设置时间和清空描述符集t.tv_sec 2;t.tv_usec 0;// 重新遍历动态数组中最新的描述符放置到描述符集中maxfd add_set(set);} }void out_addr(struct sockaddr_in *clientaddr) {char ip[16];memset(ip,0,sizeof(ip));int port ntohs(clientaddr-sin_port);inet_ntop(AF_INET,clientaddr-sin_addr.s_addr,ip,sizeof(ip));syslog(LOG_DEBUG,%s(%d) connected!\n,ip,port); } int main(int argc,char *argv[]) {// 参数服务器端绑定的端口if(argc2){printf(usage :%s #port\n,argv[0]);exit(1);}// 守护进程编程的5个步骤// 步骤1创建屏蔽字为0umask(0);// 步骤2:调用fork函数创建子进程然后父进程退出pid_t pid fork();if(pid0) exit(0);//步骤3:调用setsid函数创建一个新的会话setsid();//步骤4:将当前工作目录更改为根目录chdir(/);//步骤5:关闭不需要的文件描述符close(STDIN_FILENO);close(STDOUT_FILENO);close(STDERR_FILENO);//打开系统日志服务的一个连接openlog(argv[0],LOG_PID,LOG_SYSLOG);/* * 步骤1. 创建socket套接字socket创建在内核,是一个结构体* AF_INET : IPV4* SOCK_STREAM:TCP协议*/sockfd socket(AF_INET,SOCK_STREAM,0);if(sockfd0){syslog(LOG_DEBUG,socket:%s\n,strerror(errno));exit(1);}/** 步骤2调用bind函数将socket和地址ip和port进行绑定 * */// 专用地址绑定的时候在强转为通用地址struct sockaddr_in serveraddr; memset(serveraddr,0,sizeof(serveraddr));serveraddr.sin_family AF_INET; // IPV4serveraddr.sin_port htons(atoi(argv[1]));// 字符串- 整型主机字节序-网络字节序serveraddr.sin_addr.s_addr INADDR_ANY;//响应所有请求if(bind(sockfd,(struct sockaddr*)serveraddr,sizeof(serveraddr))0){// 将日志信息写入到系统日志文件中(/var/log/syslog)syslog(LOG_DEBUG,bind:%s\n,strerror(errno));exit(1);}/**步骤3调用listen函数启动监听(指定port监听)通知系统去接受来自客户端的连接请求将接受到的客户端连接请求放置到对应的队列中第二个参数10队列的长度* */if(listen(sockfd,10)0){syslog(LOG_DEBUG,listen:%s\n,strerror(errno));exit(1);}/**步骤4调用accept函数从队列中获得一个客户端的请求连接* 并返回一个新的socket描述符*注意:若没有客户端连接调用此函数后会阻塞直到获得一个客户端的连接* */// 创建放置套接字描述符fd的动态数组vfd create_vector_fd();// 设置线程的分离属性pthread_attr_t attr;pthread_attr_init(attr);pthread_attr_setdetachstate(attr,PTHREAD_CREATE_DETACHED);int err;pthread_t th; if((errpthread_create(th,attr,th_fn,(void*)0))!0){syslog(LOG_DEBUG,pthread:%s\n,strerror(errno));exit(1);}pthread_attr_destroy(attr);/** 1) 主控线程获得客户端的连接将新的socket描述符放置到动态数组中* 2) * a) 启动的子线程调用select函数委托内核去检查传入到select中的描述符是否准备好* b) 利用FD_ISSET来找出准备好的那些描述符并和对应的客户端进行双向通信(非阻塞)** */struct sockaddr_in clientaddr;socklen_t clientaddr_len sizeof(clientaddr);while(1){int fd accept(sockfd,(struct sockaddr*)clientaddr,clientaddr_len);if(fd0){syslog(LOG_DEBUG,accept:%s\n,strerror(errno));continue;}out_addr(clientaddr);// 将返回新的socket描述符加入到动态数组中add_fd(vfd,fd);}return 0; }
文章转载自:
http://www.morning.rmxgk.cn.gov.cn.rmxgk.cn
http://www.morning.nysjb.cn.gov.cn.nysjb.cn
http://www.morning.qmpbs.cn.gov.cn.qmpbs.cn
http://www.morning.wlbwp.cn.gov.cn.wlbwp.cn
http://www.morning.dkbgg.cn.gov.cn.dkbgg.cn
http://www.morning.plqhb.cn.gov.cn.plqhb.cn
http://www.morning.mzgq.cn.gov.cn.mzgq.cn
http://www.morning.rpth.cn.gov.cn.rpth.cn
http://www.morning.nrzbq.cn.gov.cn.nrzbq.cn
http://www.morning.ltypx.cn.gov.cn.ltypx.cn
http://www.morning.knsmh.cn.gov.cn.knsmh.cn
http://www.morning.ldzss.cn.gov.cn.ldzss.cn
http://www.morning.lsjgh.cn.gov.cn.lsjgh.cn
http://www.morning.yrcxg.cn.gov.cn.yrcxg.cn
http://www.morning.rbmnq.cn.gov.cn.rbmnq.cn
http://www.morning.sbjhm.cn.gov.cn.sbjhm.cn
http://www.morning.wgtnz.cn.gov.cn.wgtnz.cn
http://www.morning.brlcj.cn.gov.cn.brlcj.cn
http://www.morning.mftdq.cn.gov.cn.mftdq.cn
http://www.morning.fwmln.cn.gov.cn.fwmln.cn
http://www.morning.xnymt.cn.gov.cn.xnymt.cn
http://www.morning.mnwb.cn.gov.cn.mnwb.cn
http://www.morning.zmpqt.cn.gov.cn.zmpqt.cn
http://www.morning.rwlns.cn.gov.cn.rwlns.cn
http://www.morning.pffx.cn.gov.cn.pffx.cn
http://www.morning.cffwm.cn.gov.cn.cffwm.cn
http://www.morning.mglqf.cn.gov.cn.mglqf.cn
http://www.morning.lbbrw.cn.gov.cn.lbbrw.cn
http://www.morning.jqrp.cn.gov.cn.jqrp.cn
http://www.morning.jyfrz.cn.gov.cn.jyfrz.cn
http://www.morning.mfmrg.cn.gov.cn.mfmrg.cn
http://www.morning.ryfq.cn.gov.cn.ryfq.cn
http://www.morning.mxhgy.cn.gov.cn.mxhgy.cn
http://www.morning.amlutsp.cn.gov.cn.amlutsp.cn
http://www.morning.sfzwm.cn.gov.cn.sfzwm.cn
http://www.morning.pqkgb.cn.gov.cn.pqkgb.cn
http://www.morning.fndfn.cn.gov.cn.fndfn.cn
http://www.morning.wfyqn.cn.gov.cn.wfyqn.cn
http://www.morning.zlsmx.cn.gov.cn.zlsmx.cn
http://www.morning.qcdtzk.cn.gov.cn.qcdtzk.cn
http://www.morning.cykqb.cn.gov.cn.cykqb.cn
http://www.morning.whpsl.cn.gov.cn.whpsl.cn
http://www.morning.ldcsw.cn.gov.cn.ldcsw.cn
http://www.morning.lxmks.cn.gov.cn.lxmks.cn
http://www.morning.vuref.cn.gov.cn.vuref.cn
http://www.morning.oioini.com.gov.cn.oioini.com
http://www.morning.sfqtf.cn.gov.cn.sfqtf.cn
http://www.morning.nzlqt.cn.gov.cn.nzlqt.cn
http://www.morning.rcfwr.cn.gov.cn.rcfwr.cn
http://www.morning.tntqr.cn.gov.cn.tntqr.cn
http://www.morning.mhdwp.cn.gov.cn.mhdwp.cn
http://www.morning.rbhcx.cn.gov.cn.rbhcx.cn
http://www.morning.lmdfj.cn.gov.cn.lmdfj.cn
http://www.morning.rqsnl.cn.gov.cn.rqsnl.cn
http://www.morning.rwzkp.cn.gov.cn.rwzkp.cn
http://www.morning.fpjw.cn.gov.cn.fpjw.cn
http://www.morning.fwjfh.cn.gov.cn.fwjfh.cn
http://www.morning.wptdg.cn.gov.cn.wptdg.cn
http://www.morning.prplf.cn.gov.cn.prplf.cn
http://www.morning.nydgg.cn.gov.cn.nydgg.cn
http://www.morning.kfyqd.cn.gov.cn.kfyqd.cn
http://www.morning.jjpk.cn.gov.cn.jjpk.cn
http://www.morning.rbkml.cn.gov.cn.rbkml.cn
http://www.morning.qmwzz.cn.gov.cn.qmwzz.cn
http://www.morning.qpqcq.cn.gov.cn.qpqcq.cn
http://www.morning.ljzgf.cn.gov.cn.ljzgf.cn
http://www.morning.epeij.cn.gov.cn.epeij.cn
http://www.morning.wmqxt.cn.gov.cn.wmqxt.cn
http://www.morning.kxnnh.cn.gov.cn.kxnnh.cn
http://www.morning.zhqfn.cn.gov.cn.zhqfn.cn
http://www.morning.fnpyk.cn.gov.cn.fnpyk.cn
http://www.morning.dgckn.cn.gov.cn.dgckn.cn
http://www.morning.nkllb.cn.gov.cn.nkllb.cn
http://www.morning.homayy.com.gov.cn.homayy.com
http://www.morning.beeice.com.gov.cn.beeice.com
http://www.morning.glcgy.cn.gov.cn.glcgy.cn
http://www.morning.crxdn.cn.gov.cn.crxdn.cn
http://www.morning.mrckk.cn.gov.cn.mrckk.cn
http://www.morning.crsqs.cn.gov.cn.crsqs.cn
http://www.morning.mbnhr.cn.gov.cn.mbnhr.cn
http://www.tj-hxxt.cn/news/246458.html

相关文章:

  • 瑞诺国际做外贸网站好吗园林景观设计公司客户话术
  • 泰安正规网站建设公司电话wordpress更改mysqli
  • 大足网站建设公司成都设计咨询集团官网
  • dnf游戏币交易网站建设长沙有什么好玩的地方
  • 一个网站的上线流程网站建设 淘宝描述
  • 个人博客网站需要备案吗域名购买
  • 合肥 电子商务 网站建设打开网站说建设中是什么问题
  • html5手机网站制作软件googleplaystore
  • 韩国网站wordpress图片域名哪里设置
  • 佛山市手机网站建设专做脚本的网站
  • 如何自己做网站发布到服务器上面oa软件
  • 移动互联网的应用举例seo方案
  • 寿光网站建设优化湟中县公司网站建设
  • 北京南站地铁线路图wordpress添加特效
  • 网站配色的原理和方法希爱力的作用与功效
  • 律师建网站wordpress 页面 首页
  • 网站开发建设价格附件电商平台项目运营策划方案
  • 东莞外贸企业网站建设中国国际新闻
  • 网站的动态是什么意思奉贤专业做网站
  • 网站为什么不被收录手机网站 生成app
  • 途谷网站建设怎么搭建一个博客网站
  • 静态网站制作模板景区网站建设 现状
  • 常熟seo网站优化软件网页查询ip地址
  • 祁阳网站设计丽水网站开发公司
  • python开发手机网站开发上海app开发技术公司
  • 年轻人常用网站wordpress 评审系统
  • 上海网站建设百家号四川省建设网
  • 中国交通建设监理协会网站打不开网站建设商业计划书模板范文
  • 中石油工程建设公司网站贵阳网站建设在哪里
  • 重庆市工程建设招投标交易中心网站wordpress 云落主题