UDP畅聊系统简单版本
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,带有数据存储的模型图总体的框架server中udp_server.h其中add_user函数为添加新上线用户信息 1 #pragma once 2 #include 3 #include 4
千家信息网最后更新 2026年10月31日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安全错误
数据库的锁怎样保障安全
互联网科技图片
金融科技还是互联网
没上市的科技互联网公司
关于新基建和互联网科技
互联网医疗科技
易互联网科技有限公司
互联网科技股午盘股票涨跌
湖南洣水互联网科技有限公司扣款
阿里互联网科技公司
贵州叶脉互联网科技有限公司所属行业
科技互联网大厂
武汉健翔互联网络科技有限公司
黑科技闪耀互联网之光
未来五年的互联网科技
华夏恒生科技与互联网科技
佛山市拉法互联网科技有限公司
银行科技岗属于互联网吗
互联网公司属于科技吗
恒生科技指数 中概互联网
恒生互联网科技趋势
万易互联网科技有限公司
长亮科技 互联网金融
海南购全球互联网科技
宝灵互联网科技有限公司
天津腾达互联网科技有限公司
互联网数据科技专业
互联网金融科技名词解释
中科明德北京互联网科技
互联网科技圈年度人物
同城互联网络科技