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

深圳的网站制作公司目前做汽配的网站有哪些

深圳的网站制作公司,目前做汽配的网站有哪些,汕头网站建设公司哪个好,公司注册网址怎么弄🦄个人主页:修修修也 🎏所属专栏:网络编程 ⚙️操作环境:VS Code (操作系统:Ubuntu 22.04 server 64bit) 目录 搭建UDP服务器 搭建UDP客户端 其余工程文件 主函数文件Main.cc 日志打印文件Log.hpp Makefile文件 结语 搭建UDP服务器 搭建UDP服务器的主要流…

🦄个人主页:修修修也

🎏所属专栏:网络编程

⚙️操作环境:VS Code (操作系统:Ubuntu 22.04 server 64bit)


目录

搭建UDP服务器

搭建UDP客户端

其余工程文件

主函数文件Main.cc

日志打印文件Log.hpp

Makefile文件

结语


搭建UDP服务器

        搭建UDP服务器的主要流程任务如下:

        根据流程搭建UDP服务器完整代码如下:

//服务器#pragma once#include <iostream>
#include <string>
#include <strings.h>
#include <cstring>#include <sys/types.h>
#include <sys/socket.h>#include <netinet/in.h>
#include <arpa/inet.h>
#include <functional>
#include "Log.hpp"// using func_t = std::function<std::string(const std::string&)>;
typedef std::function<std::string(const std::string&)> func_t;Log lg;enum
{SOCKET_ERR=1,BIND_ERR
};uint16_t defaultport = 8080;            //端口号绑1024以上,因为[0-1023]被系统绑定了
std::string defaultip = "0.0.0.0";      //ip地址写0表示只要是我这台主机的信息我都接收
const int size = 1024;//封装服务器类
class UdpServer
{
public:UdpServer(const uint16_t &port = defaultport, const std::string &ip = defaultip):sockfd_(0), port_(port), ip_(ip),isrunning_(false){}void Init(){// 1. 创建udp socket//        socket(域(表明你支持哪种协议IPv4?IPv6?),套接字类型(面向数据报还是字节流),协议类型(一般可填0))     返回的是一个文件sockfd_ = socket(AF_INET, SOCK_DGRAM, 0); // PF_INETif(sockfd_ < 0)//如果创建套接字失败{lg(Fatal, "socket create error, sockfd: %d", sockfd_);exit(SOCKET_ERR);}lg(Info, "socket create success, sockfd: %d", sockfd_);// 2. 绑定bind socket(告诉服务器我们要使用的端口号)struct sockaddr_in local;       //sockaddr_in结构体里包含[1]16位协议类型family[2]16位端口号port[3]32位IP地址addr[4]8位填充字段zerobzero(&local, sizeof(local));   //把一段指定大小的内存初始化为0local.sin_family = AF_INET;     //IPv4协议local.sin_port = htons(port_); //端口号和IP在网络里是互相传递的,所以需要保证大家发送的端口号统一是网络字节序列,这样才不会被不同机器大小端影响local.sin_addr.s_addr = inet_addr(ip_.c_str()); //1. string(字符串ip) -> uint32_t(4字节ip) 2. uint32_t(4字节ip)必须是网络序列的 //inet_addr:把字符串风格的Ip转化为网络序列四字节ip// local.sin_addr.s_addr = htonl(INADDR_ANY);       //任意地址ip//bind绑定的本质是把你在用户态设定的一个套接字变量local绑定到内核里int n = bind(sockfd_, (const struct sockaddr*)&local, sizeof(local));if( n < 0)  //如果bind绑定失败{lg(Fatal, "bind error, errno: %d, err string: %s", errno, strerror(errno));exit(BIND_ERR);}lg(Info, "bind success, errno: %d, err string: %s", errno, strerror(errno));}//func是用户传入的数据处理方法void Run(func_t func) // 对代码进行分层{isrunning_ = true;char inbuffer[size];while(isrunning_)//服务器一定是一直在运行的{//服务器运行的第一件事,从udp读取数据struct sockaddr_in client;socklen_t len = sizeof(client);//                                                                \|/这个是用来接收对方的端口ip信息的,记录下来方便回消息能找到对方ssize_t n = recvfrom(sockfd_, inbuffer, sizeof(inbuffer) - 1, 0, (struct sockaddr*)&client, &len);if(n < 0)//接收信息失败,不影响后续运行,继续接收信息就行{lg(Warning, "recvfrom error, errno: %d, err string: %s", errno, strerror(errno));continue;}//接收信息成功,读到数据了//加工数据inbuffer[n] = 0;std::string info = inbuffer;//std::string echo_string = "server echo# " + info;//把字符串数据交给func函数处理std::string echo_string = func(info);//std::cout<<"client echo@"<<info<<std::endl;//加工好数据,返回给对方sendto(sockfd_, echo_string.c_str(), echo_string.size(), 0, (const sockaddr*)&client, len);}}~UdpServer(){if(sockfd_>0) close(sockfd_);}private:int sockfd_;     // 网路文件描述符std::string ip_; // 任意地址bind 0uint16_t port_;  // 表明服务器进程的端口号bool isrunning_;
};

搭建UDP客户端

        搭建UDP客户端的主要流程任务如下:

        根据流程搭建UDP客户端完整代码如下:

#include<iostream>
#include<string>
#include<strings.h>
#include<cstring>
#include<cstdlib>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
using namespace std;void Usage(std::string proc)
{std::cout<<"\n\rUsage: "<<proc<<" serverip serverport\n"<<std::endl;
}//
int main(int argc,char* argv[])
{//确定用户要给谁发数据if(argc != 3) //运行程序的参数:一个可执行程序名和一个ip地址和一个端口号{Usage(argv[0]);exit(0);}std::string serverip = argv[1];uint16_t serverport = std::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 sockfd = socket(AF_INET,SOCK_DGRAM,0);if(sockfd < 0){cout<<"socker error"<<endl;return 1;}//客户端要bind绑定,只不过不需要用户显式绑定,一般由操作系统随机选择,因为一个端口号只能被一个进程绑定,操作系统指定有利于化解冲突//服务器端口号必须固定,因为不固定用户很难第一下稳定的找到你,客户端不用固定,因为服务端接收客户端的消息时就会有客户端的套接字string message;char buffer[1024];while(true){//1.接收用户想发送的数据cout<<"Please Enter@ ";getline(cin,message);//cout<<message<<endl;   //客户端回显给用户要发送的数据//2.发送请求数据给客户端sendto(sockfd,message.c_str(),message.size(),0,(struct sockaddr*)&server,len);struct sockaddr_in temp;socklen_t len = sizeof(temp);//2.接收客户端回复的数据ssize_t s = recvfrom(sockfd,buffer,1023,0,(struct sockaddr*)&temp,&len);//表示成功接收到客户端返回的数据了,这个数据的处理方式是打印if(s>0){buffer[s]=0;cout<<buffer<<endl;}}close(sockfd);return 0;
}

其余工程文件

主函数文件Main.cc

        主函数中的代码逻辑分为两部分,第一是主函数逻辑,即创建并运行服务器对象.第二部分是提供服务器数据处理的回调函数,这里提供了三个不同功能的回调函数,分别是字符串大小写转换功能函数,聊天功能函数,简单复读机功能函数,指令执行功能函数.这些回调函数需要在Run服务器的时候当作参数传递给服务器,以便服务器调用这些函数来处理接收到的数据.完整代码如下:

#include "UdpServer.hpp"
#include<iostream>
#include <memory>
#include <string>
#include <vector>
#include <cstdio>// "120.78.126.148" 点分十进制字符串风格的IP地址void Usage(std::string proc)
{std::cout << "\n\rUsage: " << proc << " port[1024+]\n" << std::endl;
}//简单处理,只是在数据前加一个数据
std::string Handler(const std::string &str)
{std::string res = "Server get a message: ";//std::string res = "Server say: ";res += str;std::cout << res << std::endl;return res;
}//聊天
std::string talker(const std::string &str)
{//std::string res = "Server get a message: ";std::string res = "client say: ";res += str;std::cout << res << std::endl;std::string qus;getline(std::cin,qus);return qus;
}//字符串大小写转换
std::string ToChar(const std::string &str)
{std::string res;for(const auto e:str){if(e>='A'&&e<='Z')res+=(e+32);else if(e>='a'&&e<='z')res+=(e-32);elseres+=e;}std::cout << "转换后:"<< res << std::endl;return res;
}//检查指令合理
bool SafeCheck(const std::string &cmd)
{std::vector<std::string> key_word = {"rm","mv","cp","kill","sudo","unlink","uninstall","yum","top","while"};for(auto &word:key_word){auto pos = cmd.find(word);if(pos != std::string::npos) return false;}return true;
}//执行用户输入指令
std::string ExcuteCommand(const std::string &cmd)
{std::cout<<"get a request cmd: "<<cmd<<std::endl;//对指令做安全检查if(!SafeCheck(cmd)) return "Bad man";//直接给指令,popen帮你fork子进程FILE *fp = popen(cmd.c_str(), "r");if(nullptr == fp)//如果popen失败了{perror("popen");return "error";}std::string result;char buffer[4096];//从fp里把指令执行结果取出来while(true){char *ok = fgets(buffer, sizeof(buffer), fp);if(ok == nullptr) break;result += buffer;}pclose(fp);return result;
}// ./udpserver port
int main(int argc, char *argv[])
{if(argc != 2){Usage(argv[0]);exit(0);}uint16_t port = std::stoi(argv[1]);//构建一个服务器对象std::unique_ptr<UdpServer> svr(new UdpServer(port));//初始化服务器svr->Init(/**/);//运行服务器svr->Run(ExcuteCommand);return 0;
}

日志打印文件Log.hpp

        该文件提供了一个Log类,支持直接打印日志或分级导出日志到相应文件功能,是一个非常好用的日志小组件.完整代码如下:

#pragma once
#include<iostream>
#include<stdarg.h>
#include<time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.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.txt"class 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 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);if(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);printOnefile(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\n",logtxt);printLog(level,logtxt);}private:int printMethod;std::string path;
};

Makefile文件

        主要用于自动化编译工程文件,完整文件如下:

.PHONY:all
all:udpserver udpclientudpserver:Main.ccg++ -o $@ $^ -std=c++11
udpclient:UdpClient.ccg++ -o $@ $^ -std=c++11.PHONY:clean
clean:rm -f udpserver udpclient

结语

希望这篇关于 搭建一个简单的UDP通信服务器和客户端 的博客能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐



文章转载自:

http://hNB3fo6m.xrwbc.cn
http://Rz4aVGI8.xrwbc.cn
http://gr87p7Jn.xrwbc.cn
http://yU6O0Sra.xrwbc.cn
http://LgzngNdU.xrwbc.cn
http://4hZ9lZ6N.xrwbc.cn
http://GbnBcaMl.xrwbc.cn
http://nCn1STSw.xrwbc.cn
http://BQyTqXze.xrwbc.cn
http://1I9l8Y5x.xrwbc.cn
http://5eih7WEP.xrwbc.cn
http://LZIL1EFm.xrwbc.cn
http://hKEWy2Qe.xrwbc.cn
http://4MoXFFH1.xrwbc.cn
http://aZ59OjaT.xrwbc.cn
http://WV4uUUBc.xrwbc.cn
http://bKZcgokV.xrwbc.cn
http://KUkzTi3G.xrwbc.cn
http://TQpezSVr.xrwbc.cn
http://BzrWudg3.xrwbc.cn
http://sbIrUqT2.xrwbc.cn
http://A4Av0QEz.xrwbc.cn
http://ytRnbvsU.xrwbc.cn
http://QRDxh8Xb.xrwbc.cn
http://2150nYVO.xrwbc.cn
http://d0Q6PMpz.xrwbc.cn
http://Ks9h0cu1.xrwbc.cn
http://1AEmfrZq.xrwbc.cn
http://xg0KM3GA.xrwbc.cn
http://RESwGPOc.xrwbc.cn
http://www.dtcms.com/wzjs/778187.html

相关文章:

  • 广州模板建站公司发布平台是什么
  • 品牌网站建设找哪家游戏推广文案
  • 网站换程序 搜索引擎5东莞网站建设
  • 工程建设项目在哪个网站查询软件开发工具属于
  • 乔拓云智能建站官网应用软件商店
  • 技术支持 湖州网站建设网站用Access做数据库
  • 江西建设厅网站财务部广州安全教育平台登录账号登录入口
  • 网站建设对于学校的重要性注册网站要求
  • 黑龙江省建设会计协会网站首页wordpress页面设计
  • 驻马店公司做网站房地产的设计网站建设
  • 网站icp申请手机网站制作哪家好
  • 长沙竞价网站建设价格竞价网站怎么做seo
  • 秦皇岛网站优化公司企业发展建议
  • 网站地图建设有什么用营销型网站建设推荐乐云seo
  • 长春网站分析做网站的入门书籍
  • 徐汇专业做网站网站建设页面设计规格
  • wordpress网站不显示系列iis怎么做IP网站
  • 长春紧急通知网站优化开发
  • 跨境电商网站建设流程cms监控系统电脑版
  • 网站服务器建设教程修改wordpress主体
  • 凡科网站产品导航怎么做昆明建网站电话
  • 网站开发设计合同范本高级网站开发工程师证书
  • 哈尔滨制作网站的公司最新新闻国内大事件
  • 网站页面示意图怎么做免费企业cms
  • 个人博客网站下载如何自建公司网站
  • 做外贸的专业网站动漫做h免费网站有哪些
  • 手机网站给一个wordpress插件设置
  • 东莞微信网站建设网站开发的费用申请
  • 制作手机网站什么软件网站建设中的智能元素
  • 网站建设与管理课程实训异次元wordpress模板