#include"udp_server.h"
static void print_log(std::string _log)
{
std::cerr<<_log<<std::endl;
}
bool udp_server::register_user(struct sockaddr_in& client)
{
std::string _ip_key= inet_ntoa(client.sin_addr);
print_log(_ip_key);
std::map<std::string,struct sockaddr_in>::iterator _iter=online_user.find(_ip_key);
if(_iter != online_user.end())
{
return false;
}
online_user.insert(make_pair(_ip_key,client));
print_log("regis done..");
return true;
}
udp_server::udp_server(unsigned short int _port)
:port(_port)
{
}
udp_server::~udp_server()
{
if(sock>0)
close(sock);
}
//if success return 0
//else exit
int udp_server::init_server()
{
sock=socket(AF_INET,SOCK_DGRAM,0);
if(sock<0)
{
print_log ((strerror(errno)));
exit(1);
}
struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port = htons(port);
local.sin_addr.s_addr= htonl(INADDR_ANY);
if(bind(sock,(struct sockaddr*)&local,sizeof(local)) < 0)
{
print_log(strerror(errno));
exit(1);
}
return 0;
}
int udp_server::reliable_recv_msg()//输出型参数
{
std::string _out_msg;
int ret = recv_msg(_out_msg);
if(ret > 0)
{
// print_log("reliable_recv");
print_log(_out_msg);
pool.put_msg(_out_msg);
// print_log("after put");
return ret;
}
return -1;
}
int udp_server::recv_msg(std::string& _out_msg)//输出型参数
{
char buf[G_BLOCK_SIZE];
bzero(buf,sizeof(buf));
struct sockaddr_in client;
socklen_t len=sizeof(client);
//recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t _size = recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&client,&len);
if(_size < 0)
{
print_log(strerror(errno));
_out_msg="";
return 1;
}
else if(_size >= 0)
{
_out_msg=buf;
//keep->online_user
register_user(client);
}
return _size;
}
int udp_server::reliable_send_msg(std::string& _in_msg,struct sockaddr_in& client,socklen_t len)//输出型参数
{
return send_msg( _in_msg,client, len);//输出型参数
}
int udp_server::send_msg(std::string& _in_msg,struct sockaddr_in& client,socklen_t len)//输出型参数
{
//sendto
ssize_t _size = sendto(sock,_in_msg.c_str(),_in_msg.size(),0,(sockaddr*)&client,len);
if(_size < 0)
{
print_log(strerror(errno));
return 1;
}
else
{
}
return 0;
}
int udp_server::broadcast_msg()
{
std::string msg;
pool.get_msg(msg);
std::map<std::string,struct sockaddr_in>::iterator _iter = online_user.begin();
for(;_iter != online_user.end();++_iter)
{
print_log(msg);
reliable_send_msg(msg,_iter->second,sizeof(_iter->second));
}
return 0;
}
妄北y
- 粉丝: 2w+
- 资源: 1万+
最新资源
- 【年度培训】培训效果评估汇总表行政人事CLUB.xlsx
- 【年度培训】培训管理规范-培训管理总结行政人事CLUB.xlsx
- 【年度培训】培训成效分析图表行政人事CLUB.xlsx
- 【年度培训】培训效果评分标准行政人事CLUB.xlsx
- 【年度培训】年度培训计划记录表行政人事CLUB.xlsx
- 【年度培训】行政类专业化培训计划行政人事CLUB.xlsx
- 【年度培训】培训分析表.xls
- 【年度培训】20XX年度培训计划表行政人事CLUB.xlsx
- 【年度培训】公司内部讲师培训效果评分表行政人事CLUB.xlsx
- 【年度培训】年度培训计划表行政人事CLUB.xlsx
- 【年度培训】行政部年度培训需求计划表范例行政人事CLUB.xls
- 【年度培训】行政岗位新人入职培训计划行政人事CLUB.xls
- 【年度培训】行政年度培训计划表行政人事CLUB.xls
- 【年度培训】行政部岗前培训课程表行政人事CLUB.xls
- 【年度培训】行政部岗前培训一览表行政人事CLUB.xls
- 【年度培训】公司年度培训计划表.xls
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈