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

【Linux】基于UDP/TCP服务器与客户端的实现

目录

一、UDP

(一)Server.hpp

(二)Server.cpp

(三)Client.hpp

(四)Client.cpp

(五)User.hpp

二、TCP

(一)多进程版本的服务器与客户端

1、Server.hpp

2、Server.cpp

3、Client.hpp

4、Client.cpp

5、log.hpp

(二)多线程版本的服务器与客户端

(三)线程池版本的服务器与客户端

1、Server.hpp

2、thread.hpp

3、pthreadpool.hpp

4、Task.hpp

(四)线程池版本+守护进程的服务器与客户端

1、daemon.hpp

2、Server.cpp


一、UDP

(一)Server.hpp

#include <iostream>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <functional>
using namespace std;
class Server
{typedef function<void(int, string, uint16_t, string)> func_t;public:Server(const func_t func, const uint16_t &port, const string &ip = "0.0.0.0") : _func(func), _port(port), _ip(ip) {}void init(){_fd = socket(AF_INET, SOCK_DGRAM, 0);if (_fd == -1){cerr << "socket :" << strerror(errno) << endl;exit(1);}cerr << "socket succcess" << endl;struct sockaddr_in addr;bzero(&addr, sizeof(addr));addr.sin_family = AF_INET;addr.sin_port = htons(_port);addr.sin_addr.s_addr = inet_addr(_ip.c_str());int n = bind(_fd, (const sockaddr *)&addr, sizeof(addr));if (n != 0){cerr << "bind error : " << strerror(errno) << endl;exit(2);}cerr << "bind success" << endl;}void start(){char buffer[1024];while (1){struct sockaddr_in addr;socklen_t len = sizeof(addr);size_t n = recvfrom(_fd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&addr, &len);if (n > 0){buffer[n] = 0;uint16_t port = ntohs(addr.sin_port);string ip = inet_ntoa(addr.sin_addr);string messages = buffer;_func(_fd, ip, port, messages);}}}private:func_t _func;int _fd;uint16_t _port;string _ip;
};

(二)Server.cpp

#include "Server.hpp"
#include "User.hpp"
#include <memory>userManager m;
void handlerMessage(int sockfd, const string &ip, const uint16_t &port, const string &message)
{cout << "[" + ip + "]" + "[" + to_string(port) + "]: " + message << endl;if (message == "online")m.insert(ip, port);else if (message == "offline")m.erase(ip, port);else if (m.isOnline(ip, port))m.broadcast(sockfd, ip, port, message);else{struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(ip.c_str());addr.sin_port = htons(port);string response = "请先输入 online 上线";sendto(sockfd, response.c_str(), response.size(), 0, (struct sockaddr *)&addr, sizeof(addr));}
}
static void Usage(string proc)
{cout << "\nUsage:\n\t" << proc << " local_port\n\n";
}
int main(int argc, char *argv[])
{if (argc != 2){Usage(argv[0]);exit(3);}uint16_t port = atoi(argv[1]);unique_ptr<Server> usvr(new Server(handlerMessage, port));usvr->init();usvr->start();return 0;
}

(三)Client.hpp

#include <iostream>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>using namespace std;
class Client
{
public:Client(const uint16_t &Sport, const string &Sip) : _Sport(Sport), _Sip(Sip) {}void init(){_fd = socket(AF_INET, SOCK_DGRAM, 0);if (_fd == -1){cerr << "socket : " << strerror(errno) << endl;exit(1);}cout << "socket success" << endl;}static void *readMessage(void *arg){int sockfd = *(static_cast<int *>(arg));while (true){char buffer[1024];struct sockaddr_in temp;socklen_t temp_len = sizeof(temp);size_t n = recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&temp, &temp_len);if (n >= 0)buffer[n] = 0;cout << buffer << endl;}return nullptr;}void run(){pthread_create(&_read, nullptr, readMessage, (void *)&_fd);pthread_detach(_read);struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(_Sport);addr.sin_addr.s_addr = inet_addr(_Sip.c_str());socklen_t len = sizeof(addr);while (1){cerr << "Please input" << endl;string messages;cin >> messages;sendto(_fd, messages.c_str(), messages.size(), 0, (struct sockaddr *)&addr, sizeof(addr));}}private:int _fd;uint16_t _Sport;string _Sip;pthread_t _read;
};

(四)Client.cpp

#include "Client.hpp"
#include <memory>
static void Usage(string proc)
{cout << "\nUsage:\n\t" << proc << " local_port\n\n";
}
int main(int argc, char *argv[])
{if (argc != 3){Usage(argv[0]);exit(3);}string ip = argv[1];uint16_t port = atoi(argv[2]);unique_ptr<Client> ucli(new Client(port, ip));ucli->init();ucli->run();return 0;
}

(五)User.hpp

#pragma once
#include <iostream>
#include <string>
#include <unordered_map>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>using namespace std;
class user
{
public:user(const string &ip, const uint16_t &port) : _ip(ip), _port(port) {}string &getIp(){return _ip;}uint16_t &getPort(){return _port;}private:string _ip;uint16_t _port;
};class userManager
{
public:void insert(const string &ip, const uint16_t &port){string id = ip + "-" + to_string(port);_um.insert(make_pair(id, user(ip, port)));}void erase(const string &ip, const uint16_t &port){string id = ip + "-" + to_string(port);_um.erase(id);}bool isOnline(const string &ip, const uint16_t &port){string id = ip + "-" + to_string(port);return _um.find(id) == _um.end() ? false : true;}void broadcast(int sockfd, const string &ip, const uint16_t &port, const string &message){for (auto &user : _um){struct sockaddr_in addr;bzero(&addr, sizeof(addr));addr.sin_family = AF_INET;addr.sin_port = htons(user.second.getPort());addr.sin_addr.s_addr = inet_addr(user.second.getIp().c_str());string response = "[" + ip + "]" + "[" + to_string(port) + "]: " + message;sendto(sockfd, response.c_str(), response.size(), 0, (sockaddr *)&addr, sizeof(addr));}}private:unordered_map<string, user> _um;
};

二、TCP

(一)多进程版本的服务器与客户端

1、Server.hpp

#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <pthread.h>
#include "log.hpp"
using namespace std;
class Server
{
public:Server(const uint16_t &port) : _fd(-1), _port(port) {}void init(){_fd = socket(AF_INET, SOCK_STREAM, 0);if (_fd == -1){cerr << strerror(errno) << endl;exit(1);}logMessage(NORMAL, "socket success");struct sockaddr_in addr;bzero(&addr, sizeof(addr));addr.sin_family = AF_INET;addr.sin_addr.s_addr = INADDR_ANY;addr.sin_port = htons(_port);int n = bind(_fd, (struct sockaddr *)&addr, sizeof(addr));if (n == -1){logMessage(ERROR, strerror(errno));exit(2);}logMessage(NORMAL, "bind success");n = listen(_fd, 5);if (n < 0){cerr << strerror(errno) << endl;exit(2);}logMessage(NORMAL, "listen success");}// 进程版void start(){signal(SIGCHLD, SIG_IGN);while (1){struct sockaddr_in addr;socklen_t len = sizeof(addr);int socket = accept(_fd, (struct sockaddr *)&addr, &len);cout << "accept successs : " << socket << endl;if (socket == -1){cerr << strerror(errno) << endl;continue;}pid_t id = fork();if (id == 0){close(_fd);serviceIO(socket);close(socket);exit(0);}close(socket);}}void serviceIO(const int &fd){while (1){char buffer[1024];ssize_t size = read(fd, buffer, sizeof(buffer) - 1);if (size > 0){buffer[size] = 0;cout << "[Client] : " << buffer << endl;string messages = buffer;ssize_t ret = write(fd, messages.c_str(), messages.size());if (ret < 0){cerr << strerror(errno) << endl;}}else if (size == 0){cerr << "Client quit" << endl;break;}else{cerr << strerror(errno) << endl;exit(3);}}}void start(){while (1){struct sockaddr_in addr;socklen_t len = sizeof(addr);int socket = accept(_fd, (struct sockaddr *)&addr, &len);if (socket == -1){cerr << strerror(errno) << endl;continue;}logMessage(NORMAL, "accept successs : %d", socket);}}~Server(){close(_fd);}private:int _fd;uint16_t _port;
};

2、Server.cpp

#include "Server.hpp"
#include "daemon.hpp"
#include <memory>
static void Usage(string proc)
{cout << "\nUsage:\n\t" << proc << " local_port\n\n";
}
int main(int argc, char *argv[])
{if (argc != 2){Usage(argv[0]);exit(3);}uint16_t port = atoi(argv[1]);unique_ptr<Server> usvr(new Server(port));usvr->init();usvr->start();return 0;
}

3、Client.hpp

#include <iostream>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "log.hpp"
using namespace std;
class Client
{
public:Client(const string &ip, const uint16_t &port) : _fd(-1), _Sip(ip), _Sport(port) {}void init(){_fd = socket(AF_INET, SOCK_STREAM, 0);if (_fd == -1){cerr << strerror(errno) << endl;exit(1);}logMessage(NORMAL, "socket success");}void run(){struct sockaddr_in addr;bzero(&addr, 0);addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(_Sip.c_str());addr.sin_port = htons(_Sport);if (connect(_fd, (struct sockaddr *)&addr, sizeof(addr)) == -1){cerr << strerror(errno) << endl;exit(2);}else{while (true){string messages;cout << " please input#";getline(cin, messages);write(_fd, messages.c_str(), messages.size());char buffer[1024];int n = read(_fd, buffer, sizeof(buffer) - 1);if (n > 0){buffer[n] = 0;cout << "[Server] : " << buffer << endl;}elsebreak;}}}~Client(){close(_fd);}private:int _fd;string _Sip;uint16_t _Sport;
};

4、Client.cpp

#include "Client.hpp"
#include <memory>
static void Usage(string proc)
{cout << "\nUsage:\n\t" << proc << " local_port\n\n";
}
int main(int argc, char *argv[])
{if (argc != 3){Usage(argv[0]);exit(3);}string ip = argv[1];uint16_t port = atoi(argv[2]);unique_ptr<Client> ucli(new Client(ip, port));ucli->init();ucli->run();return 0;
}

5、log.hpp

#pragma once
#include <iostream>
#include <ctime>
#include <stdio.h>
#include <stdarg.h>
using namespace std;
#define DEBUG 0
#define NORMAL 1
#define WARNING 2
#define ERROR 3
#define FATAL 4
#define NUM 1024
const char *getLevel(const int &level)
{switch (level){case 0:return "DEBUG";case 1:return "NORMAL";case 2:return "WARNING";case 3:return "ERROR";case 4:return "FATAL";default:return nullptr;}
}
void logMessage(int level, const char *format, ...)
{char logprefix[NUM];sprintf(logprefix, "[%s][%ld]:", getLevel(level), time(nullptr));char logContext[NUM];va_list arg;va_start(arg, format);vsnprintf(logContext, sizeof(logContext), format, arg);cout << logprefix << logContext << endl;
}

(二)多线程版本的服务器与客户端

        多线程版本只有Server.hpp与多进程不同,其他文件相同。

#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <pthread.h>
#include "log.hpp"
using namespace std;
class Server
{
public:Server(const uint16_t &port) : _fd(-1), _port(port) {}void init(){_fd = socket(AF_INET, SOCK_STREAM, 0);if (_fd == -1){cerr << strerror(errno) << endl;exit(1);}logMessage(NORMAL, "socket success");struct sockaddr_in addr;bzero(&addr, sizeof(addr));addr.sin_family = AF_INET;addr.sin_addr.s_addr = INADDR_ANY;addr.sin_port = htons(_port);int n = bind(_fd, (struct sockaddr *)&addr, sizeof(addr));if (n == -1){logMessage(ERROR, strerror(errno));exit(2);}logMessage(NORMAL, "bind success");n = listen(_fd, 5);if (n < 0){cerr << strerror(errno) << endl;exit(2);}logMessage(NORMAL, "listen success");}// 线程版void start(){while (1){struct sockaddr_in addr;socklen_t len = sizeof(addr);int socket = accept(_fd, (struct sockaddr *)&addr, &len);cout << "accept successs : " << socket << endl;if (socket == -1){cerr << strerror(errno) << endl;continue;}pthread_t t;pthread_create(&t, nullptr, serviceIO, (void *)&socket);pthread_detach(t);}}static void *serviceIO(void *arg){int fd = *(static_cast<int *>(arg));while (1){char buffer[1024];ssize_t size = read(fd, buffer, sizeof(buffer) - 1);if (size > 0){buffer[size] = 0;cout << "[Client] : " << buffer << endl;string messages = buffer;ssize_t ret = write(fd, messages.c_str(), messages.size());if (ret < 0){cerr << strerror(errno) << endl;}}else if (size == 0){cerr << "Client quit" << endl;break;}else{cerr << strerror(errno) << endl;exit(3);}}close(fd);return nullptr;}void start(){while (1){struct sockaddr_in addr;socklen_t len = sizeof(addr);int socket = accept(_fd, (struct sockaddr *)&addr, &len);if (socket == -1){cerr << strerror(errno) << endl;continue;}logMessage(NORMAL, "accept successs : %d", socket);}}~Server(){close(_fd);}private:int _fd;uint16_t _port;
};

(三)线程池版本的服务器与客户端

        其他文件与多进程版本相同。

1、Server.hpp

#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <pthread.h>
#include "pthreadpool.hpp"
#include "Task.hpp"
#include "log.hpp"
using namespace std;
class Server
{
public:Server(const uint16_t &port) : _fd(-1), _port(port) {}void init(){_fd = socket(AF_INET, SOCK_STREAM, 0);if (_fd == -1){cerr << strerror(errno) << endl;exit(1);}logMessage(NORMAL, "socket success");struct sockaddr_in addr;bzero(&addr, sizeof(addr));addr.sin_family = AF_INET;addr.sin_addr.s_addr = INADDR_ANY;addr.sin_port = htons(_port);int n = bind(_fd, (struct sockaddr *)&addr, sizeof(addr));if (n == -1){logMessage(ERROR, strerror(errno));exit(2);}logMessage(NORMAL, "bind success");n = listen(_fd, 5);if (n < 0){cerr << strerror(errno) << endl;exit(2);}logMessage(NORMAL, "listen success");}void start(){pthreadPool<Task>::getInstance()->run();while (1){struct sockaddr_in addr;socklen_t len = sizeof(addr);int socket = accept(_fd, (struct sockaddr *)&addr, &len);if (socket == -1){cerr << strerror(errno) << endl;continue;}logMessage(NORMAL, "accept successs : %d", socket);pthreadPool<Task>::getInstance()->push(Task(socket, serviceIO));}}~Server(){close(_fd);}private:int _fd;uint16_t _port;
};

2、thread.hpp

#include <iostream>
#include <pthread.h>
#include <functional>
#include <string>
using namespace std;
class Thread
{typedef std::function<void *(void *)> func_t;private:static void *start_routine(void *arg){Thread *th = static_cast<Thread *>(arg);th->callback(th->_arg);}void *callback(void *arg){return _func(arg);}public:void start(func_t func, void *arg = nullptr){_func = func;_arg = arg;pthread_create(&_tid, nullptr, start_routine, this);}void join(){pthread_join(_tid, nullptr);}~Thread(){join();}private:func_t _func;pthread_t _tid;void *_arg;
};

3、pthreadpool.hpp

#include <vector>
#include <queue>
#include "thread.hpp"
#include "Task.hpp"
template <class T>
class pthreadPool
{
private:void pop(T &date){date = _tasks.front();_tasks.pop();}static void *handlerTask(void *arg){pthreadPool *th = static_cast<pthreadPool *>(arg);while (1){pthread_mutex_lock(&(th->_mutex));while (th->_tasks.empty())pthread_cond_wait(&(th->_cond), &(th->_mutex));T task;th->pop(task);pthread_mutex_unlock(&(th->_mutex));task();}return nullptr;}public:pthreadPool(int num = 10) : _num(num){pthread_mutex_init(&_mutex, nullptr);pthread_cond_init(&_cond, nullptr);for (int i = 0; i < _num; ++i){_threads.push_back(new Thread());}}~pthreadPool(){pthread_mutex_destroy(&_mutex);pthread_cond_destroy(&_cond);for (int i = 0; i < _num; ++i){delete _threads[i];}}void run(){for (int i = 0; i < _num; ++i){_threads[i]->start(handlerTask, this);}}void push(const T &date){pthread_mutex_lock(&_mutex);_tasks.push(date);pthread_cond_signal(&_cond);pthread_mutex_unlock(&_mutex);}static pthreadPool<T> *getInstance(){if (_tp == nullptr){pthread_mutex_lock(&_sin);if (_tp == nullptr){_tp = new pthreadPool();}pthread_mutex_unlock(&_sin);}return _tp;}pthreadPool(const pthreadPool<T> &tp) = delete;pthreadPool<T> operator=(pthreadPool<T>) = delete;private:int _num;vector<Thread *> _threads;queue<T> _tasks;pthread_mutex_t _mutex;pthread_cond_t _cond;static pthreadPool<T> *_tp;static pthread_mutex_t _sin;
};
template <class T>
pthreadPool<T> *pthreadPool<T>::_tp = nullptr;template <class T>
pthread_mutex_t pthreadPool<T>::_sin = PTHREAD_MUTEX_INITIALIZER;

4、Task.hpp

#pragma once
#include <iostream>
#include <functional>
#include "log.hpp"
using namespace std;
void serviceIO(const int &fd)
{while (1){char buffer[1024];ssize_t size = read(fd, buffer, sizeof(buffer) - 1);if (size > 0){buffer[size] = 0;cout << "[Client] : " << buffer << endl;string messages = buffer;ssize_t ret = write(fd, messages.c_str(), messages.size());if (ret < 0){cerr << strerror(errno) << endl;}}else if (size == 0){logMessage(NORMAL, "Client quit");break;}else{cerr << strerror(errno) << endl;exit(3);}}close(fd);
}
class Task
{typedef function<void(int)> func_t;public:Task() {}Task(const int &socket, func_t func) : _fd(socket), _func(func){}void operator()(){_func(_fd);}private:int _fd;func_t _func;
};

(四)线程池版本+守护进程的服务器与客户端

        其他文件与线程池版本相同。

1、daemon.hpp

#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <cassert>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
using namespace std;
#define DEV "/dev/null"
void daemonSelf(const char *currPath = nullptr)
{signal(SIGPIPE, SIG_IGN);if (fork() > 0)exit(0);pid_t id = setsid();assert(id != -1);int fd = open(DEV, O_RDWR);if (fd >= 0){dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);}else{close(0);close(1);close(2);}if (currPath)chdir(currPath);
}

2、Server.cpp

#include "Server.hpp"
#include "daemon.hpp"
#include <memory>
static void Usage(string proc)
{cout << "\nUsage:\n\t" << proc << " local_port\n\n";
}
int main(int argc, char *argv[])
{if (argc != 2){Usage(argv[0]);exit(3);}uint16_t port = atoi(argv[1]);unique_ptr<Server> usvr(new Server(port));usvr->init();daemonSelf();usvr->start();return 0;
}

相关文章:

【Linux】基于UDP/TCP服务器与客户端的实现

目录 一、UDP &#xff08;一&#xff09;Server.hpp &#xff08;二&#xff09;Server.cpp &#xff08;三&#xff09;Client.hpp &#xff08;四&#xff09;Client.cpp &#xff08;五&#xff09;User.hpp 二、TCP &#xff08;一&#xff09;多进程版本的服务器与…...

Unity for Python —— 强大的 Python 脚本支持提升 Unity 编辑器效率

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity for Python —— 强大的 Python 脚本支持提升 Unity 编辑器效率 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 Tec…...

【Dubbo+Zookeeper】——SpringBoot+Dubbo+Zookeeper知识整合

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…...

家用路由器的WAN口和LAN口有什么区别

今时今日&#xff0c;移动终端盛行的时代&#xff0c;WIFI可以说是家家户户都有使用到的网络接入方式。那么路由器当然也就是家家户户都不可或缺的设备了。而路由器上的两个实现网络连接的基础接口 ——WAN 口和 LAN 口&#xff0c;到底有什么区别&#xff1f;它们的功能和作用…...

Python--函数入门

1. 函数基础概念 1.1 什么是函数 定义&#xff1a;函数是一段可重复调用的代码块&#xff0c;用于封装特定功能。 核心作用&#xff1a; 代码重用&#xff1a;减少重复代码的编写。增强可读性&#xff1a;通过命名和模块化让代码逻辑更清晰。 1.2 函数的定义与调用 def 函…...

EasyRTC低延迟通信与智能处理:论嵌入式WebRTC与AI大模型的技术融合

在当今数字化时代&#xff0c;实时通信的需求日益增长&#xff0c;视频通话作为一种高效、直观的沟通方式&#xff0c;广泛应用于各个领域。WebRTC技术的出现&#xff0c;为实现浏览器之间的实时音视频通信提供了便捷的解决方案。而基于WebRTC技术的EasyRTC视频通话SDK&#xf…...

《操作系统 - 清华大学》 8 -6:进程管理:进程状态变化模型

进程状态及其转换全解析 在操作系统中&#xff0c;进程有着特定的生命周期和多种状态变化。不考虑进程结束时&#xff0c;进程主要有三个基本状态。 运行态&#xff1a;即进程正在占用CPU执行任务。总结&#xff1a;运行态表示进程当前正在使用CPU。就绪状态&#xff1a;进程…...

大语言模型中的 Token如何理解?

在大语言模型中&#xff0c;Token 是文本处理的基本单元&#xff0c;类似于“文字块”&#xff0c;模型通过将文本分割成Token来理解和生成内容。举一个形象一点的例子&#xff0c;可以理解为 AI 处理文字时的“最小积木块”。就像搭乐高时&#xff0c;每块积木是基础单位一样&…...

信息学奥赛一本通 1522:网络 | OpenJudge 百练 1144:Network

【题目链接】 ybt 1522&#xff1a;网络 OpenJudge 百练 1144:Network 【题目考点】 1. 图论&#xff1a;割点 【解题思路】 每个交换机是一个顶点&#xff0c;如果两地点之间有电话线连接&#xff0c;那么两顶点之间有一条无向边&#xff0c;该图是无向图。 初始时任何地…...

3分钟快速本地部署deepseek

DeepSeek简介 DeepSeek 是杭州深度求索人工智能基础技术研究有限公司开发的一系列大语言模型&#xff0c;背后是知名量化资管巨头幻方量化3。它专注于开发先进的大语言模型和相关技术&#xff0c;拥有多个版本的模型&#xff0c;如 DeepSeek-LLM、DeepSeek-V2、DeepSeek-V3 等…...

Linux系统管理与编程01:准备工作

0 准备工作 0.1 安装VMWare Workstation pro17 到百度搜一下&#xff0c;到处都是。安装好VMWare Workstation pro17&#xff08;以下简称VW&#xff09;。 图0- 1 安装过程略。 0.2下载CentOS7.6 图0- 2 选择minimal版本。 0.3下载yum库文件 下载阿里云yum库文件https:…...

常用的几种编码方式

常见的编码方式有多种&#xff0c;每种编码方式都有其特定的用途和特点。以下是几种常见的编码方式&#xff1a; ASCII&#xff08;美国信息交换标准代码&#xff09; 用途&#xff1a;主要用于表示英文字符及控制字符。特点&#xff1a;使用7位二进制数表示字符&#xff0c;能…...

WebXR教学 03 项目1 旋转彩色方块

一、项目结构 webgl-cube/ ├── index.html ├── main.js ├── package.json └── vite.config.js二、详细实现步骤 初始化项目 npm init -y npm install three vite --save-devindex.html <!DOCTYPE html> <html lang"en"> <head><…...

从零开始的网站搭建(以照片/文本/视频信息通信网站为例)

本文面向已经有一些编程基础&#xff08;会至少一门编程语言&#xff0c;比如python&#xff09;&#xff0c;但是没有搭建过web应用的人群&#xff0c;会写得尽量细致。重点介绍流程和部署云端的步骤&#xff0c;具体javascript代码怎么写之类的&#xff0c;这里不会涉及。 搭…...

netcore 启用gzip压缩及缓存

public void ConfigureServices(IServiceCollection services) {....// 配置gzip 与 br的压缩等级为最优services.Configure<BrotliCompressionProviderOptions>(options > {options.Level CompressionLevel.Optimal;});services.Configure<GzipCompressionProvid…...

c++入门-------命名空间、缺省参数、函数重载

C系列 文章目录 C系列前言一、命名空间二、缺省参数2.1、缺省参数概念2.2、 缺省参数分类2.2.1、全缺省参数2.2.2、半缺省参数 2.3、缺省参数的特点 三、函数重载3.1、函数重载概念3.2、构成函数重载的条件3.2.1、参数类型不同3.2.2、参数个数不同3.2.3、参数类型顺序不同 前言…...

elf_loader:一个使用Rust编写的ELF加载器

本文介绍一个使用Rust实现的ELF加载器。 下面是elf_loader的仓库链接&#xff1a; github&#xff1a; https://github.com/weizhiao/elf_loaderhttps://github.com/weizhiao/elf_loader crates.io&#xff1a; https://crates.io/crates/elf_loaderhttps://crates.io/cra…...

postman调用ollama的api

按照如下设置&#xff0c;不需要设置key 保持长会话的方法 # 首次请求 curl http://localhost:11434/api/generate -d {"model": "deepseek-r1:32b","prompt": "请永久记住&#xff1a;110&#xff0c;1-12&#xff0c;之后所有数学计算必…...

鸿蒙5.0实战案例:基于ArkUI的验证码实现

往期推文全新看点&#xff08;文中附带全新鸿蒙5.0全栈学习笔录&#xff09; ✏️ 鸿蒙&#xff08;HarmonyOS&#xff09;北向开发知识点记录~ ✏️ 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ ✏️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景&#…...

通俗理解什么是云原生?

by deepseek。 一、核心理念&#xff1a;云原生到底是什么&#xff1f; 1. 一句话定义 云原生&#xff08;Cloud Native&#xff09; 是一种构建和运行应用程序的方法论&#xff0c;它利用云计算的优势&#xff08;弹性、分布式、自动化&#xff09;&#xff0c;让软件从设计…...

基于PSO粒子群优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a/matlab2024b 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频…...

什么是完全前向保密(PFS)?

在当今数字化时代&#xff0c;信息安全至关重要。而密码学中的完全前向保密&#xff08;Perfect Forward Secrecy&#xff0c;简称PFS&#xff09;技术&#xff0c;已经成为保障信息安全的关键一环。如果没有完全前向保密&#xff0c;一旦长期密钥被泄露&#xff0c;攻击者就可…...

Oracle备库srvctl start丢失某个原有的service_names的案例

最近在测试主备环境中使用srvctl添加新的service之后&#xff0c;srvctl start发现其中一个原本用于主备同步的service丢失了。 原始的参数文件中的service_names参数值如下(数据库中service_names的值也一样&#xff0c;省略查看步骤)&#xff1a; [oraclesmartdbstb01 202502…...

重学SpringBoot3-怎样优雅停机

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞??收藏评论 重学SpringBoot3-怎样优雅停机 1. 什么是优雅停机&#xff1f;2. Spring Boot 3 优雅停机的配置3. Tomcat 和 Reactor Netty 的优雅停机机制 3.1 Tomcat 优雅停机3.2 Reactor Netty 优…...

SkyWalking集成Kafka实现日志异步采集经验总结

SkyWalking日志异步采集架构 【重点知识】 1、【Agent】kafka-reporter-plugin-x.x.x.jar包放plugins目录后必走kafka&#xff08;kafka没有正确配置就会报错&#xff09; 2、【Agent】异步如不开启数据压缩&#xff0c;日志数据较大&#xff0c;pod多、业务大时容易造成网络…...

图论 之 BFS

文章目录 3243.新增道路查询后的最短距离1311.获取你好友已观看的视频 BFS:广度优先搜索&#xff08;BFS&#xff09; 是一种常用的算法&#xff0c;通常用于解决图或树的遍历问题&#xff0c;尤其是寻找最短路径或层级遍历的场景。BFS 的核心思想是使用队列&#xff08;FIFO 数…...

rust学习笔记5-所有权机制

rust核心就是所有权机制&#xff0c;是其内存管理的核心特性&#xff0c;旨在消除内存安全问题&#xff08;如空指针、悬垂指针、内存泄漏等&#xff09;而无需依赖垃圾回收&#xff08;GC&#xff09; 1.首先看一下语义模型 当声明一个变量 let a "32";它的语义模…...

网站快速收录:如何优化网站404页面?

优化网站404页面是提升用户体验和SEO效果的重要一环。以下是一些优化404页面的建议&#xff1a; 一、设计友好的404页面 简洁明了的提示信息&#xff1a;使用清晰的语言告诉用户该页面不存在或已被删除&#xff0c;避免使用过于技术化的术语。 提供导航链接&#xff1a;在40…...

关于order by的sql注入实验

实验描述 本实验基于sqli-lab的第46关进行测试 本关的sql 语句为$sql "SELECT * FROM users ORDER BY $id" 利用sort进行sql注入&#xff0c;我们可以利用报错注入&#xff0c;延时注入来爆出数据 1.报错注入 1.手工测试 爆出数据库 ?sort(extractvalue(1, c…...

Docker(Nginx)部署Vue

简介&#xff1a;目标使用docker将vue生成的dist文件&#xff0c;结合nginx生成镜像&#xff0c;然后运行&#xff1b; 1、首选确保vue项目正确运行&#xff0c;并能正确打包dist文件&#xff1b; 2、查看已经生成的dist文件 3、将dist文件打包为rar文件或者zip文件&#xf…...

从函数到神经网络

一、从函数到神经网络 所有一切的前提是&#xff0c;你要相信这个世界上的所有逻辑和知识&#xff0c;都可以用一个函数来表示。Functions describe the world ! 比如输入物体的质量和加速度&#xff0c;根据牛顿第二定律&#xff0c;就可以得到物体施加的力&#xff0c;这就是…...

Python 字符串格式化 print

Python 字符串格式化 print flyfish 1. 使用百分号&#xff08;%&#xff09;操作符进行字符串格式化 百分号&#xff08;%&#xff09;操作符是 Python 中比较传统的字符串格式化方式&#xff0c;它的使用方式类似于 C 语言中的 printf 函数。 # 格式化整数 num 10 print…...

LabVIEW 中的 Bluetooth.llb 库

Bluetooth.llb 库位于C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform目录&#xff0c;它是 LabVIEW 平台下用于蓝牙通信相关操作的重要库。该库为 LabVIEW 开发者提供了一系列工具&#xff0c;用于实现设备间的蓝牙连接、数据传输与交互等功能&…...

MySQL | MySQL库、表的基本操作01

MySQL库、表的基本操作01 一、库操作1.1 查看数据库1.2 创建数据库1.3 选择数据库1.4 查看创建数据库的SQL语句1.5 修改数据库1.6 删除数据库 二、表操作2.1 创建数据表2.2 查看表2.3 查看表结构2.4 查看创建数据库的SQL语句2.5 修改表2.6 删除表 ⚠️MySQL版本 8.0 一、库操作…...

抖音试水AI分身;腾讯 AI 战略调整架构;百度旗下小度官宣接入DeepSeek...|网易数智日报

抖音试水AI分身&#xff0c;字节旗下AI智能体平台扣子已与抖音打通&#xff0c;相关功能内测中 2月19日消息&#xff0c;钛媒体App独家获悉&#xff0c;字节旗下AI智能体开发平台扣子&#xff08;Coze&#xff09;已与抖音打通&#xff0c;抖音创作者可在扣子智能体平台打造AI分…...

RPC 框架项目剖析

RPC 框架项目剖析 说明 本文用于梳理一个 rpc项目的实现细节&#xff0c;此项目基于cpp语言 大概三千行左右&#xff0c;用于学习目的。 项目链接&#xff1a;rpc项目 项目底层类 1.抽象消息类 描述&#xff1a; 各种消息的基类 属性&#xff1a; 消息id&#xff0c;消息类型…...

前端 fetch API 调用 Tushare 的数据接口获取免费的基金股票信息数据

要在前端使用 JavaScript 的 fetch API 调用 Tushare 的数据接口&#xff0c;您需要遵循以下步骤&#xff1a; 1. 注册 Tushare 账号并获取 Token 首先&#xff0c;访问 Tushare 官网 注册账号。注册成功后&#xff0c;登录账号&#xff0c;在个人中心获取您的 API Token。 …...

【SpringMVC】十分钟跑起来一个SpringMVC项目

目录标题 1 项目概述1.项目结构解析2. MVC项目的结构和每个组件的作用&#xff1a;3. 项目的工作流程&#xff1a;4 后期可以扩展的点&#xff1a;2.源码学习1. HelloController 类&#xff0c;Spring MVC控制器2 springmvc-servlet.xml - Spring MVC的主要配置文件3.web 目录 …...

LeetCode 热题 100 11. 盛最多水的容器

LeetCode 热题 100 | 11. 盛最多水的容器 大家好&#xff0c;今天我们来解决一道经典的算法题——盛最多水的容器。这道题在LeetCode上被标记为中等难度&#xff0c;要求我们找到两条垂线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。下面我将详细讲解解题思路…...

Web自动化之Selenium实战案例1:论文pdf自动下载

在上一篇文章中&#xff0c;我们介绍了Selenium的基础用法和一些常见技巧。今天&#xff0c;我们将通过中国科学&#xff1a;信息科学网站内当前目录论文下载这一实战案例来进一步展示Selenium的web自动化流程。 目录 中国科学&#xff1a;信息科学当期目录论文下载 1.网页内…...

在VSCode中接入deepseek

注册就送14元2000万tokens。 https://cloud.siliconflow.cn/i/rnbA6i6U各种大模型 下面介绍我是如如接入vscode的 左边生成一个key&#xff0c;呆会vscode要用&#xff0c;不然401. 打开vscod&#xff0c;电脑能上网。下插件。 下好要配置 点它一下。 要配置&#xff0c;全…...

CentOS停服后的替代选择:openEuler、Rocky Linux及其他系统的未来展望

CentOS停服后的替代选择&#xff1a;openEuler、Rocky Linux及其他系统的未来展望 引言CentOS停服的背景华为openEuler&#xff1a;面向未来的开源操作系统1. 简介2. 特点3. 发展趋势 Rocky Linux&#xff1a;CentOS的精神继承者1. 简介2. 特点3. 发展趋势 其他可选的替代系统1…...

vector的模拟实现

目录 一、构造和析构函数 二、插入删除访问迭代器 三、迭代器失效 四、拷贝构造和赋值 五、tip 一、构造和析构函数 namespace stn {template<class T>class vector{typedef T* iterator;public:vector():_start(nullptr);, _end(nullptr), _endofstorage(nullptr){…...

【高可用】keepalived的试用与学习笔记

版本日期修订人描述V1.02025/2/23nick huang创建文档 背景 最近&#xff0c;预研给现有的Nginx单点实例添加故障转移的功能&#xff0c;以备单实例故障时无法快速恢复。 本文记录Keepalived的学习笔记&#xff0c;供自己或同学日后参考。 Keepalived Keepalived是一个开源的…...

在Dify中实现联网检索功能(模拟DeepSeek)

跟着上一篇博客&#xff1a;Error response from daemon: Get “https://registry-1.docker.io/v2/“: request canceled while的解决办法-CSDN博客 DeepSeek发布之后&#xff0c;感觉联网检索功能变成标配了。这篇博客简单介绍一下怎么在Dify中配置初步的联网检索功能&#x…...

Deepseek-强化学习算法(通俗易懂版)

首先先贴一张Deepseek核心技术的梳理图&#xff1a; 上图详细了讲述了Deepseek主要在哪些阶段用了强化学习方法&#xff08;GRPO&#xff09; 1.GRPO算法 GRPO是一种用于提高语言模型推理能力的强化学习算法。它在DeepSeekMath论文中&#xff0c;在数学推理的背景下被提出。G…...

[展示]Webrtc NoiseSuppressor降噪模块嵌入式平台移植

最近在尝试把WebRtc的NoiseSuppressor模块移植到嵌入式平台&#xff0c;现在已经移植了&#xff0c;尝试了下效果&#xff0c;降噪效果很显著&#xff0c;噪声带被显著抑制了 降噪前&#xff1a; 降噪后&#xff1a;...

了解 RAG 第二部分:经典 RAG 的工作原理

在本系列的第一篇文章中&#xff0c;我们介绍了检索增强生成 (RAG) &#xff0c;解释了扩展传统大型语言模型 (LLM)功能的必要性。我们还简要概述了 RAG 的核心思想&#xff1a;从外部知识库检索上下文相关的信息&#xff0c;以确保 LLM 生成准确且最新的信息&#xff0c;而不会…...

剖析IO原理和零拷贝机制

目录 1 Linux的五种IO模型1.1 模型调用的函数1.1.1 recv函数1.1.2 select函数1.1.3 poll函数1.1.4 epoll函数1.1.5 sigaction函数 1.2 IO模型1.2.1 阻塞IO模型1.2.2 非阻塞IO模型1.2.3 IO复用模型1.2.4 信号驱动IO模型1.2.5 异步IO模型1.2.6 IO模型比较 2 Java的BIO、NIO、AIO2…...

【论文精读】MapTR:用于在线矢量化高精地图构建的结构化建模与学习

论文地址&#xff1a; MAPTR: STRUCTURED MODELING AND LEARNING FOR ONLINE VECTORIZED HD MAP CONSTRUCTION 源代码&#xff1a;MapTR 摘要 High-definition&#xff08;HD Map&#xff09;map为自动驾驶场景提供了丰富且精确的环境信息&#xff0c;是自动驾驶系统规划中不…...