外部网站 同意加载,福州营销型网站建设价格,网站设计策划书怎么写,柴油发电机组网站建设价格在这篇博客中#xff0c;我们将探索 UDP#xff08;用户数据报协议#xff09; 通信#xff0c;简要地说#xff0c;UDP 是一种无连接、快速但不可靠的通信协议#xff0c;适用于需要快速数据传输但对丢包容忍的场景#xff0c;比如视频流和在线游戏。就像《我是如此相信…         在这篇博客中我们将探索 UDP用户数据报协议 通信简要地说UDP 是一种无连接、快速但不可靠的通信协议适用于需要快速数据传输但对丢包容忍的场景比如视频流和在线游戏。就像《我是如此相信》的图片所表达的那样UDP 没有过多的保障机制它直接、简单、快捷就像信念一样直接而坚定。  1、网络协议中的下三层主要解决的是数据安全可靠得发送到远端机器 2、用户使用应用层软件完成数据的发送和接收先把软件启动起来那就是进程因此网络通信的本质就是进程间的通信。 一、认识端口号 
端口号无论是客户端还是服务器都能唯一的标识该主机上的一个特定应用层的进程ip地址唯一的标识一个主机端口号只能用来标识该主机上的唯一进程。IPPort能够标识全网唯一的进程。 
二、套接字 
客户端和服务器通信的时候就好像插头和插座的关系 端口号VS进程pid但是pid已经可以唯一标识一个进程为什么还要端口号 1、不是所有的进程都要网络通信 2、pid属于操作系统中的进程管理但是要是系统出问题网络部分也要改牵一发而动全身因此要解耦。 我们的客户端怎么知道服务器的端口号每个服务器的端口必须是众所周知的被客户端知道。 一个进程可以绑定多个端口号一个端口号不可以被多个进程绑定。经过哈希找的进程就不一样了 2、  套接字的种类域间本地通信、原始编写网络工具抓包和网络套接字 
三、UDP和TCP TCPTransmission Control Protocol传输控制协议网络必须连通 面向连接在数据传输之前发送端和接收端需要通过三次握手建立连接。这一过程确保了双方都准备好进行数据传输并且知道对方的存在和状态为可靠的数据传输奠定基础。例如当你使用浏览器访问一个网站时浏览器与网站服务器之间会先建立 TCP 连接然后才开始传输网页数据.可靠性高TCP 协议通过多种机制来确保数据的准确无误传输。它使用确认机制接收方在收到数据后会向发送方发送确认消息发送方只有在收到确认后才会继续发送下一部分数据否则会重传未确认的数据。同时TCP 还具备重传机制对于在传输过程中丢失或损坏的数据发送方会自动重新发送直到数据被正确接收。此外流量控制和拥塞控制也是 TCP 保证可靠性的重要手段它可以根据网络状况和接收方的处理能力动态调整数据传输的速率避免网络拥塞导致数据丢失.数据有序TCP 会对数据进行编号和排序确保数据按照发送的顺序到达接收端。即使数据在网络中经过不同的路径传输到达接收端时也会被正确地重组保证应用程序能够接收到完整、有序的数据。例如在文件传输过程中文件的各个部分会按照顺序依次传输并在接收端正确拼接。适用于多种应用由于其可靠性高TCP 适用于对数据准确性要求严格的应用场景如文件传输FTP、电子邮件SMTP、POP3 等、远程登录Telnet、网页浏览HTTP、HTTPS等这些应用需要确保数据的完整性和准确性不容许数据丢失或出错。 UDPUser Datagram Protocol用户数据报协议 无连接UDP 在发送数据之前不需要与接收方建立连接发送方可以随时向目标地址发送数据报。这使得 UDP 的传输过程更加简单、快速减少了连接建立和拆除的开销1.不可靠传输UDP 不提供数据传输的可靠性保证它不会对数据进行确认、重传或排序等操作。数据报在网络中可能会出现丢失、重复或乱序的情况并且 UDP 本身不会对这些问题进行处理而是由应用层来负责处理数据的可靠性问题。不过在一些对实时性要求较高但对数据准确性要求相对较低的应用中这种不可靠性是可以接受的例如在线游戏中的玩家位置信息更新、视频会议中的语音和视频数据传输等偶尔丢失一两个数据包不会对整体效果产生太大影响1.低延迟由于不需要建立连接和进行复杂的可靠性控制UDP 的传输延迟相对较低能够快速地将数据发送到目标地址。这对于实时性要求高的应用非常有利如音频流、视频流等实时多媒体应用可以在保证一定流畅度的前提下尽可能减少延迟1.高效性UDP 协议的头部开销较小只有 8 个字节相比 TCP 的 20 个字节头部UDP 可以在相同的网络带宽下传输更多的数据提高了数据传输的效率1.适用于特定应用UDP 常用于一些对实时性和效率要求较高但对数据可靠性要求相对较低的应用场景如网络视频会议、在线游戏、音频流播放、实时监控等。例如在网络视频会议中即使偶尔丢失一些视频帧也不会对会议的进行产生严重影响而较低的延迟可以保证参会者之间的交互更加流畅。 四、网络字节序  
1、判断是小端还是大端 小权重放到小地址就是小端小小小 
大端数据的高位字节存于低地址低位字节存于高地址。  
程序判断机器是大端还是小端 
#include stdio.h
int main() {int num  0x12345678;char *ptr  (char *)num;if (*ptr  0x78) {printf(Little - Endian\n);} else if (*ptr  0x12) {printf(Big - Endian\n);} else {printf(Error\n);}return 0;
} 
2、网络规定都是大端 低地址高字节 
五、UDP客户端服务器通信  步骤1、创建UDP套接字 下面为创建套接字的接口 socket          第一个参数表示的是使用的协议家族域到底是什么第二个表示定义的套接字类型流还是数据报第三个参数表示协议参数填0就行 返回值 On success, a file descriptor for the new socket is returned.  On error, -1 is returned, and errno is set appropriately.             2、绑定 bind 插入如何快速地将整数ip转为字符串 比如12345667转为0.0.36.123 我们经常用的就是点分十进制但是我们要知道如何转换。有接口inet_addr 
【0255】.【0255】.【0255】.【0255】 
struct ip
{uint8_t part1;  //占一个字节uint8_t part2;uint8_t part3;uint8_t part4;
}
int src_ip12345678;
struct ip *p(struct ip*)src_ip; //由于 src_ip 是一个 32 位的整数而 struct ip 是一个包含四个 uint8_t 类型字段的结构体直接把 src_ip 赋值给 struct ip 类型的变量是不可能的类型不兼容。但是通过指针我们可以将 src_ip 的内存解释为 struct ip 类型并按字节访问它。
to_string(p-part1).to_string(p-part2).to_string(p-part3).to_string(p-part4);就把四字节转换为字符串风格的ip
结果是0.0.3.182 字符串转整数 ”192.168.50.100“  ”192“ ”168“”50“”100“ 
//192.168.50.100 转换为 123455556
uint32_t Ip; 4个字节
struct ip* x(struct ip*)Ip;
x-part1stoi(192);
x-part2stoi(168);
x-part3stoi(50);
x-part4stoi(100); 
查看服务器启动的命令netstat -nau 一个关于ip 云服务器禁止直接bind公网ip一个机器可能有多个ipbind(IP:0),IP为0叫做任意地址绑定凡是发给我这台主机的数据我们都要根据端口号向上交付。   一个关于port 【01023】属于系统内定的端口号一般都要有固定的应用层协议使用 http:80 https:443 mysql:3306 我们绑定1024以上的 结论IP地址绑定0端口号绑定1024以上的  六、程序实现 
Log.hpp
#pragma once#include iostream
#include time.h
#include stdarg.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include unistd.h
#include stdlib.h#define SIZE 1024#define Info 0
#define Debug 1
#define Warning 2
#define Error 3
#define Fatal 4#define Screen 1
#define Onefile 2
#define Classfile 3#define LogFile log.txtclass Log
{
public:Log(){printMethod  Screen;path  ./log/;}void Enable(int method){printMethod  method;}std::string levelToString(int level){switch (level){case Info:return Info;case Debug:return Debug;case Warning:return Warning;case Error:return Error;case Fatal:return Fatal;default:return None;}}// void logmessage(int level, const char *format, ...)// {//     time_t t  time(nullptr);//     struct tm *ctime  localtime(t);//     char leftbuffer[SIZE];//     snprintf(leftbuffer, sizeof(leftbuffer), [%s][%d-%d-%d %d:%d:%d], levelToString(level).c_str(),//              ctime-tm_year  1900, ctime-tm_mon  1, ctime-tm_mday,//              ctime-tm_hour, ctime-tm_min, ctime-tm_sec);//     // va_list s;//     // va_start(s, format);//     char rightbuffer[SIZE];//     vsnprintf(rightbuffer, sizeof(rightbuffer), format, s);//     // va_end(s);//     // 格式默认部分自定义部分//     char logtxt[SIZE * 2];//     snprintf(logtxt, sizeof(logtxt), %s %s\n, leftbuffer, rightbuffer);//     // printf(%s, logtxt); // 暂时打印//     printLog(level, logtxt);// }void printLog(int level, const std::string logtxt){switch (printMethod){case Screen:std::cout  logtxt  std::endl;break;case Onefile:printOneFile(LogFile, logtxt);break;case Classfile:printClassFile(level, logtxt);break;default:break;}}void printOneFile(const std::string logname, const std::string logtxt){std::string _logname  path  logname;int fd  open(_logname.c_str(), O_WRONLY | O_CREAT | O_APPEND, 0666); // log.txtif (fd  0)return;write(fd, logtxt.c_str(), logtxt.size());close(fd);}void printClassFile(int level, const std::string logtxt){std::string filename  LogFile;filename  .;filename  levelToString(level); // log.txt.Debug/Warning/FatalprintOneFile(filename, logtxt);}~Log(){}void operator()(int level, const char *format, ...){time_t t  time(nullptr);struct tm *ctime  localtime(t);char leftbuffer[SIZE];snprintf(leftbuffer, sizeof(leftbuffer), [%s][%d-%d-%d %d:%d:%d], levelToString(level).c_str(),ctime-tm_year  1900, ctime-tm_mon  1, ctime-tm_mday,ctime-tm_hour, ctime-tm_min, ctime-tm_sec);va_list s;va_start(s, format);char rightbuffer[SIZE];vsnprintf(rightbuffer, sizeof(rightbuffer), format, s);va_end(s);// 格式默认部分自定义部分char logtxt[SIZE * 2];snprintf(logtxt, sizeof(logtxt), %s %s, leftbuffer, rightbuffer);// printf(%s, logtxt); // 暂时打印printLog(level, logtxt);}private:int printMethod;std::string path;
};// int sum(int n, ...)
// {
//     va_list s; // char*
//     va_start(s, n);//     int sum  0;
//     while(n)
//     {
//         sum  va_arg(s, int); // printf(hello %d, hello %s, hello %c, hello %d,, 1, hello, c, 123);
//         n--;
//     }//     va_end(s); //s  NULL
//     return sum;
// } 
Main.cc
#include UdpServer.hpp
#include memory
#include Log.hpp
Log log;void Usage(std::string proc)
{std::cout\n\rUsage:procproc[1024]std::endl;
}
//./udpserver port
//192.168.1.123点分十进制字符串风格的ip地址一共占了13个字节
int main(int argc,char *argv[])
{if(argc!2){Usage(argv[0]);exit(0);}uint16_t portstd::stoi(argv[1]);  //字符串转整数std::unique_ptrUdpServer svr(new UdpServer());svr-Init();svr-Run();return 0;
} 
Makefile
.PHONY:all
all:Udpserver Udpclient
Udpserver:Main.ccg -o $ $^ -stdc11
Udpclient:UdpClient.ccg -o $ $^ -stdc11
.PHONY:
clean: rm -f Udpserver Udpclient 
Udpclient
#includeiostream
#includeunistd.h
#includecstdlib
#includesys/types.h
#includestring.h
#includesys/socket.h
#includenetinet/in.h
#includearpa/inet.h
using namespace std;
void Usage(std::string proc)
{std::cout\n\rUsage:procserverip serverportstd::endl;
}
// ./udpclient serverip serverport 启动客户端的时候必须要是ip和端口号是是什么
int main(int argc,char* argv[])
{if(argc!3){Usage(argv[0]);exit(0);}std::string serveripargv[1];uint16_t serverportstd::stoi(argv[2]);//构建服务器信息struct sockaddr_in server;bzero(server, sizeof(server));server.sin_family  AF_INET;server.sin_port  htons(serverport);server.sin_addr.s_addr  inet_addr(serverip.c_str());socklen_t len  sizeof(server);int sockfdsocket(AF_INET,SOCK_DGRAM,0);//client要绑定要有自己的IP和端口只不过不需要用户显示的bind,一般由os随机选择肯定是客户端先向服务器发起请求端口号能唯一标识客户端就行随机分配但是服务器的端口号必须要准确知道不然客户端绑定哪一个//系统什么时候给我Bind首次放松数据的时候就绑定sendtostring message;char buffer[1024];//接收时候的bufferwhile(1){coutPlease Enter;std::getline(cin,message);coutmessageendl;//1.数据 2.给谁发 server 发送给serversendto(sockfd,message.c_str(),message.size(),0,(struct sockaddr*)server,len);struct sockaddr_in temp;socklen_t lensizeof(temp);//服务器发消息处理了之后再给客户端发回来客户端就要去接收ssize_t srecvfrom(sockfd,buffer,1023,0,(struct sockaddr*)temp,len);  //倒数第二个是谁发的if(s0){buffer[s]0;}coutbufferendl;}close(sockfd);return 0;
}; 
Udpserver
#pragma once
#includeiostream
#includesys/types.h
#includesys/socket.h
#includestring.h
#includestring
#includenetinet/in.h
#includearpa/inet.h
#include Log.hpp
extern Log log;
enum{SOCKET_ERR1,BIND_ERR2
};
uint16_t defaultport8080;
std::string defaultip0.0.0.0;
const int size1024;
class UdpServer
{
public:UdpServer(const uint16_t portdefaultport,const std::string ipdefaultip):port_(port),sockfd_(0),ip_(ip),isrunning_(false)//一个服务器要启动起来端口号要有Ip地址也要有{}void Init(){sockfd_socket(AF_INET,SOCK_DGRAM,0);//创建套接字if(sockfd_0){log(Fatal,socket create error,sockfd:%d,sockfd_);exit(SOCKET_ERR);}printf(socket create success,sockfd:%d\n,sockfd_);log(Info,socket create success,sockfd:%d,sockfd_);struct sockaddr_in local;bzero(local,sizeof(local));//把结构体里面的内容全部清零 ,第二个参数是缓冲区的大小local.sin_familyAF_INET;local.sin_porthtons(port_); //我要给你发数据你必须知道我的端口号我要把我的端口号发给你因此端口号是需要在网络中传输的必须是网络字节序列//local.sin_addr.s_addrinet_addr(ip_.c_str());  //1.string-uint32_t   将string转char* string.c_str()local.sin_addr.s_addrINADDR_ANY;//0,任意绑定因为是全0主机转网络不需要做bind(sockfd_,(const struct sockaddr *)local,sizeof(local));}//服务器应该周而复始的运行void Run(){isrunning_true;char inbuffer[size];while (isrunning_){
//完成一次收和一次发struct sockaddr_in client;//客户端信息socklen_t len sizeof(client);//从哪个套接字中读,读到的消息放到哪里,读多大谁给发的结构体大小ssize_t nrecvfrom(sockfd_,inbuffer,sizeof(inbuffer)-1,0,(sockaddr*)client,len);if(n0){log(Warning,recvform error);continue;}inbuffer[n]0;//对字符串进行加工std::string infoinbuffer;std::string echo_stringserver echo#info;//再把数据发送回给对方 string的长度  string.size//你本地的套接字发送的字符串和长度默认为0输入性参数我知道对方是谁因为当时对方给我发过消息sendto(sockfd_,echo_string.c_str(),echo_string.size(),0,(const sockaddr*)client,len);}}~UdpServer(){if(sockfd_0)  close(sockfd_);}
private:int sockfd_;//网络文件描述符uint16_t port_; //端口号是两个字节16个比特位,服务器要有自己的端口号std::string ip_;//任意地址绑定填为0bool isrunning_;
}; 
改进版 
Main.cc
#include UdpServer.hpp
#include memory
#include cstdio
#include Log.hpp
Log log;void Usage(std::string proc)
{std::cout\n\rUsage:procproc[1024]std::endl;
}
std::string Handler(const std::string str)
{std::string resServer get a message:;resstr;return res;//服务器收到消息回调式的调用你传进来的方法把数进行加工加工处理完后返回最后把这个结果发出去
}
std::string ExecuteCommand(const std::string cmd)
{// SafeCheck(cmd);FILE* fppopen(cmd.c_str(),r);if(nullptrfp){perror(popen);return error;}std::string result;//从fp中把命令执行结果都拿出来char buffer[4096];while(true){char * resfgets(buffer,4096,fp);//读到一行if(nullptrres) break;resultbuffer;}return result;pclose(fp);
}
//./udpserver port
//192.168.1.123点分十进制字符串风格的ip地址一共占了13个字节
int main(int argc,char *argv[])
{if(argc!2){Usage(argv[0]);exit(0);}uint16_t portstd::stoi(argv[1]);  //字符串转整数std::unique_ptrUdpServer svr(new UdpServer());svr-Init();svr-Run(ExecuteCommand);return 0;
} 
Udpserver.hpp
#pragma once
#includeiostream
#includesys/types.h
#includesys/socket.h
#includestring.h
#includestring
#includenetinet/in.h
#includearpa/inet.h
#include functional
#include Log.hpp
using func_tstd::functionstd::string(const std::string); //返回值为string参数为const std::string的函数传递给Udpserver
//等价于typedef std::functionstd::string(const std::string) func_t;
extern Log log;
enum{SOCKET_ERR1,BIND_ERR2
};
uint16_t defaultport8080;
std::string defaultip0.0.0.0;
const int size1024;
class UdpServer
{
public:UdpServer(const uint16_t portdefaultport,const std::string ipdefaultip):port_(port),sockfd_(0),ip_(ip),isrunning_(false)//一个服务器要启动起来端口号要有Ip地址也要有{}void Init(){sockfd_socket(AF_INET,SOCK_DGRAM,0);//创建套接字if(sockfd_0){log(Fatal,socket create error,sockfd:%d,sockfd_);exit(SOCKET_ERR);}printf(socket create success,sockfd:%d\n,sockfd_);log(Info,socket create success,sockfd:%d,sockfd_);struct sockaddr_in local;bzero(local,sizeof(local));//把结构体里面的内容全部清零 ,第二个参数是缓冲区的大小local.sin_familyAF_INET;local.sin_porthtons(port_); //我要给你发数据你必须知道我的端口号我要把我的端口号发给你因此端口号是需要在网络中传输的必须是网络字节序列//local.sin_addr.s_addrinet_addr(ip_.c_str());  //1.string-uint32_t   将string转char* string.c_str()local.sin_addr.s_addrINADDR_ANY;//0,任意绑定因为是全0主机转网络不需要做bind(sockfd_,(const struct sockaddr *)local,sizeof(local));}//服务器应该周而复始的运行//这样的好处是实现代码的分层void Run(func_t func)//运行的时候需要用户传进来一个怎么处理数据的方法{isrunning_true;char inbuffer[size];while (isrunning_){
//完成一次收和一次发struct sockaddr_in client;//客户端信息socklen_t len sizeof(client);//从哪个套接字中读,读到的消息放到哪里,读多大谁给发的结构体大小ssize_t nrecvfrom(sockfd_,inbuffer,sizeof(inbuffer)-1,0,(sockaddr*)client,len);if(n0){log(Warning,recvform error);continue;}inbuffer[n]0;std::string infoinbuffer;std::string echo_string func(info);sendto(sockfd_,echo_string.c_str(),echo_string.size(),0,(const sockaddr*)client,len);}}~UdpServer(){if(sockfd_0)  close(sockfd_);}
private:int sockfd_;//网络文件描述符uint16_t port_; //端口号是两个字节16个比特位,服务器要有自己的端口号std::string ip_;//任意地址绑定填为0bool isrunning_;
};  文章转载自: http://www.morning.qtkdn.cn.gov.cn.qtkdn.cn http://www.morning.pcwzb.cn.gov.cn.pcwzb.cn http://www.morning.fwnyz.cn.gov.cn.fwnyz.cn http://www.morning.hxpff.cn.gov.cn.hxpff.cn http://www.morning.xbmwm.cn.gov.cn.xbmwm.cn http://www.morning.hgkbj.cn.gov.cn.hgkbj.cn http://www.morning.hrgxk.cn.gov.cn.hrgxk.cn http://www.morning.rsnd.cn.gov.cn.rsnd.cn http://www.morning.c7496.cn.gov.cn.c7496.cn http://www.morning.zstry.cn.gov.cn.zstry.cn http://www.morning.wrbf.cn.gov.cn.wrbf.cn http://www.morning.crkmm.cn.gov.cn.crkmm.cn http://www.morning.npkrm.cn.gov.cn.npkrm.cn http://www.morning.kqnwy.cn.gov.cn.kqnwy.cn http://www.morning.mkyny.cn.gov.cn.mkyny.cn http://www.morning.tjsxx.cn.gov.cn.tjsxx.cn http://www.morning.kfmlf.cn.gov.cn.kfmlf.cn http://www.morning.ndpwg.cn.gov.cn.ndpwg.cn http://www.morning.yltnl.cn.gov.cn.yltnl.cn http://www.morning.smqjl.cn.gov.cn.smqjl.cn http://www.morning.pftjj.cn.gov.cn.pftjj.cn http://www.morning.xmbhc.cn.gov.cn.xmbhc.cn http://www.morning.mbpzw.cn.gov.cn.mbpzw.cn http://www.morning.ydryk.cn.gov.cn.ydryk.cn http://www.morning.zpqbh.cn.gov.cn.zpqbh.cn http://www.morning.xbxks.cn.gov.cn.xbxks.cn http://www.morning.rxfgh.cn.gov.cn.rxfgh.cn http://www.morning.jrwbl.cn.gov.cn.jrwbl.cn http://www.morning.nrzbq.cn.gov.cn.nrzbq.cn http://www.morning.kpyyf.cn.gov.cn.kpyyf.cn http://www.morning.qflwp.cn.gov.cn.qflwp.cn http://www.morning.rgfx.cn.gov.cn.rgfx.cn http://www.morning.nwclg.cn.gov.cn.nwclg.cn http://www.morning.jqmmf.cn.gov.cn.jqmmf.cn http://www.morning.mzzqs.cn.gov.cn.mzzqs.cn http://www.morning.yqsr.cn.gov.cn.yqsr.cn http://www.morning.jklns.cn.gov.cn.jklns.cn http://www.morning.snrhg.cn.gov.cn.snrhg.cn http://www.morning.pgggs.cn.gov.cn.pgggs.cn http://www.morning.rnpnn.cn.gov.cn.rnpnn.cn http://www.morning.frzdt.cn.gov.cn.frzdt.cn http://www.morning.rhchr.cn.gov.cn.rhchr.cn http://www.morning.nqmwk.cn.gov.cn.nqmwk.cn http://www.morning.kzcfp.cn.gov.cn.kzcfp.cn http://www.morning.rlksq.cn.gov.cn.rlksq.cn http://www.morning.ljbpk.cn.gov.cn.ljbpk.cn http://www.morning.4r5w91.cn.gov.cn.4r5w91.cn http://www.morning.wiitw.com.gov.cn.wiitw.com http://www.morning.jfch.cn.gov.cn.jfch.cn http://www.morning.qnftc.cn.gov.cn.qnftc.cn http://www.morning.wqbbc.cn.gov.cn.wqbbc.cn http://www.morning.jhxtm.cn.gov.cn.jhxtm.cn http://www.morning.rqmr.cn.gov.cn.rqmr.cn http://www.morning.kbdrq.cn.gov.cn.kbdrq.cn http://www.morning.gpfuxiu.cn.gov.cn.gpfuxiu.cn http://www.morning.zrbpx.cn.gov.cn.zrbpx.cn http://www.morning.zgqysw.cn.gov.cn.zgqysw.cn http://www.morning.hxcrd.cn.gov.cn.hxcrd.cn http://www.morning.flxgx.cn.gov.cn.flxgx.cn http://www.morning.yrrnx.cn.gov.cn.yrrnx.cn http://www.morning.knryp.cn.gov.cn.knryp.cn http://www.morning.gfjgq.cn.gov.cn.gfjgq.cn http://www.morning.nrzbq.cn.gov.cn.nrzbq.cn http://www.morning.xbrxk.cn.gov.cn.xbrxk.cn http://www.morning.spwm.cn.gov.cn.spwm.cn http://www.morning.ztrht.cn.gov.cn.ztrht.cn http://www.morning.qgfy.cn.gov.cn.qgfy.cn http://www.morning.wmhlz.cn.gov.cn.wmhlz.cn http://www.morning.tfei69.cn.gov.cn.tfei69.cn http://www.morning.yongkangyiyuan-pfk.com.gov.cn.yongkangyiyuan-pfk.com http://www.morning.mmtjk.cn.gov.cn.mmtjk.cn http://www.morning.wqngt.cn.gov.cn.wqngt.cn http://www.morning.pwzzk.cn.gov.cn.pwzzk.cn http://www.morning.yhrfg.cn.gov.cn.yhrfg.cn http://www.morning.sbqrm.cn.gov.cn.sbqrm.cn http://www.morning.elbae.cn.gov.cn.elbae.cn http://www.morning.clnmf.cn.gov.cn.clnmf.cn http://www.morning.nkpls.cn.gov.cn.nkpls.cn http://www.morning.mrfr.cn.gov.cn.mrfr.cn http://www.morning.080203.cn.gov.cn.080203.cn