UDP畅聊系统简单版本
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,带有数据存储的模型图总体的框架server中udp_server.h其中add_user函数为添加新上线用户信息 1 #pragma once 2 #include 3 #include 4
千家信息网最后更新 2025年12月01日UDP畅聊系统简单版本
带有数据存储的模型图

总体的框架

server中
udp_server.h
其中add_user函数为添加新上线用户信息
1 #pragma once 2 #include3 #include
udp_server.cpp
1 #include "udp_server.h" 2 #include "comm.h" 3 #include "data_pool.h" 4 5 udp_server::udp_server(const std::string &default_ip,const short &default_po rt) 6 :_ip(default_ip) 7 ,_port(default_port) 8 ,_sock(-1) 9 {} 10 11 udp_server::~udp_server() 12 { 13 if(_sock > 0) 14 close(_sock); 15 } 16 17 void udp_server::init() 18 { 19 _sock=socket(AF_INET,SOCK_DGRAM,0); 20 if(_sock <0) 21 { 22 print_log(strerror(errno),__FUNCTION__,__LINE__); 23 exit(1); 24 } 25 struct sockaddr_in local; 26 socklen_t len=sizeof(local); 27 local.sin_family=AF_INET; 28 local.sin_port=htons(_port); 29 if(_ip.c_str()=="any") 30 { 31 local.sin_addr.s_addr=htonl(INADDR_ANY); 32 } 33 else 34 local.sin_addr.s_addr=inet_addr(_ip.c_str()); 35 if(bind(_sock,(struct sockaddr*)&local,len)<0) 36 { 37 print_log(strerror(errno),__FUNCTION__,__LINE__); 38 exit(2); 39 } 40 } 41 42 int udp_server::recv_data() 43 { 44 std::string _out; 45 struct sockaddr_in client; 46 socklen_t len=sizeof(client); 47 char buf[_SIZE_]; 48 buf[0]='\0'; 49 ssize_t _size=recvfrom(_sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&clie nt,&len); 50 if(_size < 0) 51 { 52 print_log(strerror(errno),__FUNCTION__,__LINE__); 53 } 54 else if(_size == 0) 55 { 56 const char *msg="client closed..."; 57 print_log(msg,__FUNCTION__,__LINE__); 58 } 59 else 60 { 61 buf[_size]='\0'; 62 _out=buf; 63 string key_ip=inet_ntoa(client.sin_addr); 64 print_log(key_ip.c_str(),__FUNCTION__,__LINE__); 65 add_user(key_ip,client); 66 _pool_data.put_data(_out); 67 } 68 return _size; 69 } 70 71 void udp_server::add_user(string &key_ip,struct sockaddr_in &client) 72 { 73 std::map::iterator _iter=_online_user.f ind(key_ip); 74 if(_iter==_online_user.end()) 75 { 76 _online_user.insert(std::pair(key_i p,client)); 77 } 78 else 79 return; 80 } 81 82 int udp_server::send_data(struct sockaddr_in &client,socklen_t len,std::str ing& msg) 83 { 84 ssize_t _size=sendto(_sock,msg.c_str(),msg.size(),0,(struct sockaddr*)& client,len); 85 if( _size <0) 86 { 87 print_log(strerror(errno),__FUNCTION__,__LINE__); 88 exit(1); 89 } 90 91 return _size; 92 } 93 int udp_server::broadcast() 94 { 95 std::string _in; 96 std::map::iterator _iter=_online_user.b egin(); 97 while(_iter!=_online_user.end()) 98 { 99 //send_data(_iter->second,sizeof(_iter->second),_in);100 _pool_data.get_data(_in);101 _iter++;102 }103 return 0;104 } server_main.cpp中,两个线程处理函数分别处理接收与广播数据
1 #include "udp_server.h" 2 3 void Usage(const char* proc) 4 { 5 cout<<"Usage:"<recv_data(); 14 } 15 } 16 17 void* broad_cast(void* arg) 18 { 19 udp_server* _ser=(udp_server*)arg; 20 while(1) 21 { 22 _ser->broadcast(); 23 } 24 } 25 26 int main(int argc,const char* argv[]) 27 { 28 if(argc!=3) 29 { 30 Usage(argv[0]); 31 exit(1); 32 } 33 string ip=argv[1]; 34 int port=atoi(argv[2]); 35 udp_server _ser(ip,port); 36 _ser.init(); 37 pthread_t tid1; 38 pthread_t tid2; 39 pthread_create(&tid1,NULL,recv,(void*)&_ser); 40 pthread_create(&tid2,NULL,broad_cast,(void*)&_ser); 41 42 pthread_join(tid1,NULL); 43 pthread_join(tid2,NULL); 44 // while(1) 45 // { 46 // std::string msg; 47 // if(_ser.recv_data(msg)>0) 48 // { 49 // cout<<"client say:"<client中进行发送消息和接收消息
udp_client.h
1 #pragma once 2 3 #include 4 using namespace std; 5 #include 6 #include 7 8 class udp_client 9 { 10 public: 11 udp_client(const string &default_ip="192.168.137.129",const short &defa ult_port=8080); 12 ~udp_client(); 13 void init(); 14 int recv_data(string& _out); 15 int send_data(string& _in); 16 protected: 17 string _ip; 18 short _port; 19 int _sock; 20 };
udp_client.cpp
1 #include "udp_client.h" 2 #include "comm.h" 3 4 udp_client::udp_client(const string &default_ip,const short &default_port) 5 :_ip(default_ip) 6 ,_port(default_port) 7 ,_sock(-1) 8 {} 9 10 udp_client::~udp_client() 11 { 12 if(_sock > 0) 13 close(_sock); 14 } 15 16 17 void udp_client::init() 18 { 19 _sock=socket(AF_INET,SOCK_DGRAM,0); 20 if(_sock <0) 21 { 22 print_log(strerror(errno),__FUNCTION__,__LINE__); 23 exit(1); 24 } 25 } 26 27 int udp_client::recv_data(string &_out) 28 { 29 struct sockaddr_in server; 30 socklen_t len=sizeof(server); 31 char buf[_SIZE_]; 32 buf[0]='\0'; 33 ssize_t _size=recvfrom(_sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&ser ver,&len); 34 if(_size < 0) 35 { 36 print_log(strerror(errno),__FUNCTION__,__LINE__); 37 } 38 else if(_size == 0) 39 { 40 const char *msg="server closed..."; 41 print_log(msg,__FUNCTION__,__LINE__); 42 } 43 else 44 { 45 buf[_size]='\0'; 46 _out=buf; 47 } 48 return _size; 49 } 50 51 int udp_client::send_data(string& _in) 52 { 53 struct sockaddr_in server; 54 server.sin_family=AF_INET; 55 server.sin_port=htons(_port); 56 server.sin_addr.s_addr=inet_addr(_ip.c_str()); 57 socklen_t len=sizeof(server); 58 ssize_t _size=sendto(_sock,_in.c_str(),_in.size(),0,(struct sockaddr*)& server,len); 59 if(_size < 0) 60 { 61 print_log(strerror(errno),__FUNCTION__,__LINE__); 62 } 63 return _size; 64 }client_main.cpp
1 #include "udp_client.h" 2 #include "comm.h" 3 4 void Usage(const char* proc) 5 { 6 assert(proc); 7 cout<<"Usage:"<0) 33 { 34 rec=buf; 35 _cli.send_data(rec); 36 } 37 if(buf=="quit") 38 { 39 cout<<"no data send"<0) 44 { 45 cout<<"server echo:"<<_in; 46 } 47 } 48 return 0; 49 } Makefile
1 ROOT_PATH=$(shell pwd) 2 SERVER=$(ROOT_PATH)/server 3 CLIENT=$(ROOT_PATH)/client 4 COMM=$(ROOT_PATH)/comm 5 DATA_POOL=$(ROOT_PATH)/data_pool 8 SERVER_BIN=udp_server 9 CLIENT_BIN=udp_client 10 11 12 INCLUDE=-I$(COMM) -I$(DATA_POOL) 13 INCLUDE+=-I$(DATA_POOL) 14 INCLUDE+=-I$(ROOT_PATH)/lib/include 15 16 CC=g++ 17 FLAGS= 18 LDFLAGS=-lpthread #-static 19 20 SER_SRC=$(shell ls -R $(SERVER) |grep -E '*.cpp') 21 SER_SRC+=$(shell ls -R $(COMM) |grep -E '*.cpp') 22 SER_SRC+=$(shell ls -R $(DATA_POOL) |grep -E '*.cpp') 23 SER_OBJ=$(SER_SRC:.cpp=.o) 25 CLI_SRC=$(shell ls -R $(CLIENT) |grep -E '*.cpp') 26 CLI_SRC+=$(shell ls -R $(COMM) |grep -E '*.cpp') 27 CLI_OBJ=$(CLI_SRC:.cpp=.o) 28 29 .PHONY:all 30 all:$(SERVER_BIN) $(CLIENT_BIN) 31 $(SERVER_BIN):$(SER_OBJ) 32 @$(CC) -o $@ $^ $(LDFLAGS) 33 @echo "Linking [ $^ ] to [ $@ ] ...done" 34 $(CLIENT_BIN):$(CLI_OBJ) 35 @$(CC) -o $@ $^ $(LDFLAGS) 36 @echo "Linking [ $^ ] to [ $@ ] ...done" 37 %.o:$(COMM)/%.cpp 38 @$(CC) -c $< $(INCLUDE) 39 @echo "Compling [ $(shell basename $<) ] to [ $@ ] ...done" 40 %.o:$(DATA_POOL)/%.cpp 41 @$(CC) -c $< $(INCLUDE) 42 @echo "Compling [ $(shell basename $<) ] to [ $@ ] ...done" 43 %.o:$(SERVER)/%.cpp 44 @$(CC) -c $< $(INCLUDE) 45 @echo "Compling [ $(shell basename $<) ] to [ $@ ] ...done" 46 %.o:$(CLIENT)/%.cpp 47 @$(CC) -c $< $(INCLUDE) 48 @echo "Compling [ $(shell basename $<) ] to [ $@ ] ...done" 49 62 .PHONY:clean 63 clean: 64 @rm -f *.o $(SERVER_BIN) $(CLIENT_BIN) 65 @echo "cleaning done..." 66 67 .PHONY:debug 68 debug: 69 @echo $(SER_SRC) 70 @echo $(CLI_SRC)
函数
数据
消息
两个
信息
总体
框架
模型
用户
线程
处理
存储
广播
版本
系统
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
打开本地数据库服务器
广警网络安全与执法试验班
常用医学数据库管理系统有哪些
go语言并发写入数据库
软件开发量和测试量
网络安全基地投资
深圳深圳软件开发
rx5服务器异常无法播放音乐
串口服务器 原理
第一视频北京网络技术
java 单机数据库
信息网络技术简称为
老旧服务器
服务器维护管理最新考试题
网络安全监管法治的定义
服务器硬件构成及选型
软件开发最低价格
中国知网数据库包含的系统
软件开发是学文还是学理
四平交互式边缘计算服务器
红外数据库背景步骤
关于网络安全的论文英语翻译
山东360网络安全服务
数据库筛选出字母内容
网络技术学习好物安利
网络安全生态保障服务
java聊天室数据库
网络安全宣传教育进万家
wifi认证服务器
双阳区网络安全经验丰富