在线翻译
udpServer.hpp
#include<iostream>
#include<string>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<strings.h>
#include<functional>
using namespace std;
namespace szg
{
class udpServer
{
public:
typedef function<void(int, sockaddr_in, string)> func;
udpServer(func f, const uint16_t port, const uint32_t ip = INADDR_ANY)
:_port(port), _ip(ip),_func(f)
{}
void udpInit()
{
_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == _sockfd)
{
cerr << "server socket failed" << endl;
exit(1);
}
sockaddr_in server_in;
bzero(&server_in, sizeof(server_in));
server_in.sin_family = AF_INET;
server_in.sin_port = htons(_port);
server_in.sin_addr.s_addr = htonl(_ip);
int rb = bind(_sockfd, (sockaddr*)&server_in, sizeof(server_in));
if(rb == -1)
{
cerr << "server bind failed" << endl;
exit(1);
}
}
void run()
{
sockaddr_in target_addr;
bzero(&target_addr, sizeof(target_addr));
socklen_t len = sizeof(target_addr);
char rcbuf[1024];
string massege;
cout << "server start" << endl;
while(true)
{
ssize_t n = recvfrom(_sockfd, rcbuf, sizeof(rcbuf) - 1, 0, (sockaddr*)&target_addr, &len);
if(n > 0)
{
rcbuf[n] = 0;
cout << inet_ntoa(target_addr.sin_addr) << "{" << target_addr.sin_port << "}" << rcbuf << endl;
massege = rcbuf;
_func(_sockfd, target_addr, massege);
}
}
}
~udpServer()
{}
private:
int _sockfd;
uint16_t _port;
uint32_t _ip;
func _func;
};
}
udpServer.cc
#include"udpServer.hpp"
#include<memory>
#include<map>
#include<fstream>
map<string, string> dict;
void loadDict()
{
ifstream in("./dict.txt", ios::binary);
string massage;
while(in >> massage)
{
size_t n = massage.find(":");
if(n == string::npos)
continue;
dict[string(massage.begin(), massage.begin() + n)] = massage.substr(n + 1);
}
in.close();
}
void translate(int sockfd, sockaddr_in target, string s)
{
string respone;
target.sin_family = AF_INET;
if(dict.find(s) == dict.end())
{
respone = "unknow";
}
else
{
respone = dict[s];
}
ssize_t n = sendto(sockfd, respone.c_str(), respone.size(), 0, (sockaddr*)&target, sizeof(target));
}
int main(int args, char* argv[])
{
if(args != 2)
{
cerr << "please input port" << endl << endl;
exit(1);
}
loadDict();
cout << " load sucess" << endl;
unique_ptr<szg::udpServer> server(new szg::udpServer(translate, (uint16_t)atoi(argv[1])));
server->udpInit();
server->run();
return 0;
}
udpClient.hpp
#include<iostream>
#include<string>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<strings.h>
#include<functional>
using namespace std;
namespace szg
{
class udpClient
{
public:
udpClient(const uint32_t ip, const uint16_t port)
:_ip(ip), _port(port)
{}
void Init()
{
_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == _sockfd)
{
cerr << "client socket failed" << endl;
exit(1);
}
cout << "init success" << endl;
}
void Run()
{
sockaddr_in target;
target.sin_family = AF_INET;
target.sin_addr.s_addr = htonl(_ip);
target.sin_port = htons(_port);
char rcbuf[1024];
socklen_t len = sizeof(target);
while(true)
{
string massage;
printf("Enter#");
fflush(stdout);
getline(cin, massage);
if(massage.size() == 0)
{
continue;
}
ssize_t n = sendto(_sockfd, massage.c_str(), massage.size(), 0, (sockaddr*)&target, sizeof(target));
if(n == -1)
{
cerr << "client send failed" << endl;
}
n = recvfrom(_sockfd, rcbuf, sizeof(rcbuf) - 1, 0, (sockaddr*)&target, &len);
if(n > 0)
{
rcbuf[n] = 0;
cout << rcbuf << endl;
}
}
}
~udpClient()
{}
private:
uint32_t _ip;
uint16_t _port;
int _sockfd;
};
}
udpClient.cc
#include"udpClient.hpp"
#include<memory>
int main(int args, char* argv[])
{
if(args != 3)
{
cerr << "please input # ip and port " << endl;
exit(1);
}
uint32_t ip = inet_addr(argv[1]);
ip = ntohl(ip);
unique_ptr<szg::udpClient> client(new szg::udpClient(ip, (uint16_t)atoi(argv[2])));
client->Init();
client->Run();
return 0;
}
minishall
想要完成一个命令行解释器,就只需要将translate函数改为miniShall就可以了。
void miniShall(int sockfd, sockaddr_in target, string s)
{
char buf[1024] = {0};
target.sin_family = AF_INET;
string respone;
FILE* pfd = popen(s.c_str(), "r");
if(pfd == nullptr)
{
cout << "cmd cannot find" << endl;
}
while(fgets(buf, sizeof(buf), pfd))
{
respone += buf;
}
fclose(pfd);
ssize_t n = sendto(sockfd, respone.c_str(), respone.size(), 0, (sockaddr*)&target, sizeof(target));
buf[0] = 0;
}
简单聊天室
udpServer.hpp
#include<iostream>
#include<string>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<strings.h>
#include<functional>
using namespace std;
namespace szg
{
class udpServer
{
public:
typedef function<void(int, sockaddr_in, string)> func;
udpServer(func f, const uint16_t port, const uint32_t ip = INADDR_ANY)
:_port(port), _ip(ip),_func(f)
{}
void udpInit()
{
_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == _sockfd)
{
cerr << "server socket failed" << endl;
exit(1);
}
sockaddr_in server_in;
bzero(&server_in, sizeof(server_in));
server_in.sin_family = AF_INET;
server_in.sin_port = htons(_port);
server_in.sin_addr.s_addr = htonl(_ip);
int rb = bind(_sockfd, (sockaddr*)&server_in, sizeof(server_in));
if(rb == -1)
{
cerr << "server bind failed" << endl;
exit(1);
}
}
void run()
{
sockaddr_in target_addr;
bzero(&target_addr, sizeof(target_addr));
socklen_t len = sizeof(target_addr);
char rcbuf[1024];
string massege;
cout << "server start" << endl;
while(true)
{
ssize_t n = recvfrom(_sockfd, rcbuf, sizeof(rcbuf) - 1, 0, (sockaddr*)&target_addr, &len);
if(n > 0)
{
rcbuf[n] = 0;
cout << inet_ntoa(target_addr.sin_addr) << "{" << target_addr.sin_port << "}" << rcbuf << endl;
massege = rcbuf;
_func(_sockfd, target_addr, massege);
}
}
}
~udpServer()
{}
private:
int _sockfd;
uint16_t _port;
uint32_t _ip;
func _func;
};
}
udpClient.hpp
#include<iostream>
#include<string>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<strings.h>
#include<functional>
#include<pthread.h>
using namespace std;
namespace szg
{
class udpClient
{
public:
udpClient(const uint32_t ip, const uint16_t port)
:_ip(ip), _port(port)
{}
void Init()
{
_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == _sockfd)
{
cerr << "client socket failed" << endl;
exit(1);
}
cout << "init success" << endl;
}
static void* ReadRoute(void* u)
{
pthread_detach(pthread_self());
udpClient* uc = static_cast<udpClient*>(u);
char rcbuf[1024];
sockaddr_in peer;
bzero(&peer, sizeof(peer));
socklen_t len = sizeof(peer);
while(true)
{
ssize_t n = recvfrom(uc->_sockfd, rcbuf, sizeof(rcbuf) - 1, 0, (sockaddr*)&peer, &len);
if(n > 0)
{
rcbuf[n] = 0;
cout << rcbuf << endl;
}
}
}
void Run()
{
sockaddr_in target;
target.sin_family = AF_INET;
target.sin_addr.s_addr = htonl(_ip);
target.sin_port = htons(_port);
pthread_t pt;
int ret = pthread_create(&pt, nullptr, ReadRoute, (void*)this);
while(true)
{
string massage;
fprintf(stderr, "Enter#");
fflush(stderr);
getline(cin, massage);
if(massage.size() == 0)
{
continue;
}
ssize_t n = sendto(_sockfd, massage.c_str(), massage.size(), 0, (sockaddr*)&target, sizeof(target));
if(n == -1)
{
cerr << "client send failed" << endl;
}
}
}
~udpClient()
{}
private:
uint32_t _ip;
uint16_t _port;
int _sockfd;
};
}
OnlineUsers.hpp
#include<iostream>
#include<string>
#include<strings.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unordered_map>
using namespace std;
namespace szg
{
class OnlineUsers
{
public:
void adduser(sockaddr_in peer)
{
string name = inet_ntoa(peer.sin_addr);
name += "#" + to_string(ntohs(peer.sin_port));
if(users.count(name) == 0)
{
users[name] = peer;
cout << name << " : online" << endl;
}
}
void offline(sockaddr_in peer)
{
string name = inet_ntoa(peer.sin_addr);
name += "#" + to_string(ntohs(peer.sin_port));
if(users.count(name) > 0)
{
users.erase(name);
}
}
bool is_online(sockaddr_in peer)
{
string name = inet_ntoa(peer.sin_addr);
name += "#" + to_string(ntohs(peer.sin_port));
if(users.count(name) > 0)
{
return true;
}
return false;
}
void BroadCastMassage(int sockfd, string massage)
{
socklen_t len = sizeof(sockaddr_in);
for(auto& e : users)
{
sendto(sockfd, massage.c_str(), massage.size(), 0, (sockaddr*)&e.second, len);
}
}
private:
unordered_map<string, sockaddr_in> users;
};
}
udpServer.cc
#include"udpServer.hpp"
#include"OnlineUser.hpp"
#include<memory>
#include<map>
#include<fstream>
#include<stdio.h>
map<string, string> dict;
szg::OnlineUsers users;
void loadDict()
{
ifstream in("./dict.txt", ios::binary);
string massage;
while(in >> massage)
{
size_t n = massage.find(":");
if(n == string::npos)
continue;
dict[string(massage.begin(), massage.begin() + n)] = massage.substr(n + 1);
}
in.close();
}
void translate(int sockfd, sockaddr_in target, string s)
{
string respone;
target.sin_family = AF_INET;
if(dict.find(s) == dict.end())
{
respone = "unknow";
}
else
{
respone = dict[s];
}
ssize_t n = sendto(sockfd, respone.c_str(), respone.size(), 0, (sockaddr*)&target, sizeof(target));
}
void miniShall(int sockfd, sockaddr_in target, string s)
{
char buf[1024] = {0};
target.sin_family = AF_INET;
string respone;
FILE* pfd = popen(s.c_str(), "r");
if(pfd == nullptr)
{
cout << "cmd cannot find" << endl;
}
while(fgets(buf, sizeof(buf), pfd))
{
respone += buf;
}
fclose(pfd);
ssize_t n = sendto(sockfd, respone.c_str(), respone.size(), 0, (sockaddr*)&target, sizeof(target));
buf[0] = 0;
}
void chatcast(int sockfd, sockaddr_in target, string s)
{
string respone;
if(users.is_online(target))
{
respone = inet_ntoa(target.sin_addr);
respone += "-";
respone += to_string(ntohs(target.sin_port));
respone += "#";
if(s == string("offline"))
{
respone += "offline";
users.BroadCastMassage(sockfd, respone);
users.offline(target);
}
else
{
respone += s;
users.BroadCastMassage(sockfd, respone);
}
}
else if(s == string("online"))
{
users.adduser(target);
respone += "online";
users.BroadCastMassage(sockfd, respone);
}
else
{
respone = "please to be online";
ssize_t n = sendto(sockfd, respone.c_str(), respone.size(), 0, (sockaddr*)&target, sizeof(target));
}
}
int main(int args, char* argv[])
{
if(args != 2)
{
cerr << "please input port" << endl << endl;
exit(1);
}
//loadDict();
//cout << " load sucess" << endl;
unique_ptr<szg::udpServer> server(new szg::udpServer(chatcast, (uint16_t)atoi(argv[1])));
server->udpInit();
server->run();
return 0;
}
udpClient.cc
#include"udpClient.hpp"
#include<memory>
int main(int args, char* argv[])
{
if(args != 3)
{
cerr << "please input # ip and port " << endl;
exit(1);
}
uint32_t ip = inet_addr(argv[1]);
ip = ntohl(ip);
unique_ptr<szg::udpClient> client(new szg::udpClient(ip, (uint16_t)atoi(argv[2])));
client->Init();
client->Run();
return 0;
}