mirror of https://github.com/agdsn/xerxes.git
xerxes is now able to transfer Data between the client and
the MySQL Server.
This commit is contained in:
parent
0bf9d52b74
commit
ced4343f69
23
socket.cxx
23
socket.cxx
|
|
@ -74,15 +74,34 @@ namespace xerxes
|
||||||
MysqlData& data,
|
MysqlData& data,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
return ::recv(socket.fd, data.first.get(), data.second, flags);
|
int ret = ::recv(socket.fd, data.first.get(), data.second, flags);
|
||||||
|
if(ret == 0)
|
||||||
|
{
|
||||||
|
throw ConResetErr();
|
||||||
|
}
|
||||||
|
if(ret < 0)
|
||||||
|
{
|
||||||
|
throw ConDataErr();
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
send (Socket& socket,
|
send (Socket& socket,
|
||||||
MysqlData& data,
|
MysqlData& data,
|
||||||
|
int len,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
return ::send(socket.fd, data.first.get(), data.second, flags);
|
int ret = ::send(socket.fd, data.first.get(), len, flags);
|
||||||
|
if(ret == 0)
|
||||||
|
{
|
||||||
|
throw ConResetErr();
|
||||||
|
}
|
||||||
|
if(ret < 0)
|
||||||
|
{
|
||||||
|
throw ConDataErr();
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@ namespace xerxes
|
||||||
int
|
int
|
||||||
send(Socket& socket,
|
send(Socket& socket,
|
||||||
MysqlData& data,
|
MysqlData& data,
|
||||||
|
int len,
|
||||||
int flags);
|
int flags);
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
@ -95,7 +96,7 @@ namespace xerxes
|
||||||
{
|
{
|
||||||
events[source.fd] = event_t(new epoll_event);
|
events[source.fd] = event_t(new epoll_event);
|
||||||
events[target.fd] = event_t(new epoll_event);
|
events[target.fd] = event_t(new epoll_event);
|
||||||
events[source.fd]->events = EPOLLIN;
|
events[source.fd]->events = EPOLLIN
|
||||||
| EPOLLPRI | EPOLLERR | EPOLLHUP;
|
| EPOLLPRI | EPOLLERR | EPOLLHUP;
|
||||||
events[target.fd]->events = events[source.fd]->events;
|
events[target.fd]->events = events[source.fd]->events;
|
||||||
events[source.fd]->data.fd = target.fd;
|
events[source.fd]->data.fd = target.fd;
|
||||||
|
|
@ -126,6 +127,10 @@ namespace xerxes
|
||||||
int fd;
|
int fd;
|
||||||
std::map<int, event_t> events;
|
std::map<int, event_t> events;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SocketErr{};
|
||||||
|
class ConResetErr: public SocketErr{};
|
||||||
|
class ConDataErr: public SocketErr{};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
54
xerxes.cxx
54
xerxes.cxx
|
|
@ -41,6 +41,10 @@ main(int argc, char* argv[])
|
||||||
freeaddrinfo(res);
|
freeaddrinfo(res);
|
||||||
|
|
||||||
int ret = listen(lstn, 3);
|
int ret = listen(lstn, 3);
|
||||||
|
if( ret != 0)
|
||||||
|
{
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
EPoll epoll;
|
EPoll epoll;
|
||||||
epoll.add(lstn);
|
epoll.add(lstn);
|
||||||
|
|
@ -49,6 +53,8 @@ main(int argc, char* argv[])
|
||||||
boost::shared_array<epoll_event> events(new epoll_event[max_events]);
|
boost::shared_array<epoll_event> events(new epoll_event[max_events]);
|
||||||
std::map<int, boost::shared_ptr<Socket> > sockets;
|
std::map<int, boost::shared_ptr<Socket> > sockets;
|
||||||
|
|
||||||
|
MysqlData buffer = makeData(1024);
|
||||||
|
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
int num = epoll_wait(epoll.fd, events.get(), max_events, -1);
|
int num = epoll_wait(epoll.fd, events.get(), max_events, -1);
|
||||||
|
|
@ -70,11 +76,9 @@ main(int argc, char* argv[])
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
hints.ai_protocol = IPPROTO_TCP;
|
hints.ai_protocol = IPPROTO_TCP;
|
||||||
hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
|
hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
|
||||||
|
|
||||||
getaddrinfo("127.0.0.1", "3306", &hints, &res);
|
getaddrinfo("127.0.0.1", "3306", &hints, &res);
|
||||||
|
//getaddrinfo("127.0.0.1", "25", &hints, &res);
|
||||||
connect(*target, res->ai_addr, res->ai_addrlen);
|
connect(*target, res->ai_addr, res->ai_addrlen);
|
||||||
|
|
||||||
freeaddrinfo(res);
|
freeaddrinfo(res);
|
||||||
|
|
||||||
sockets[target->fd] = target;
|
sockets[target->fd] = target;
|
||||||
|
|
@ -85,9 +89,47 @@ main(int argc, char* argv[])
|
||||||
|
|
||||||
epoll.add(*source, *target);
|
epoll.add(*source, *target);
|
||||||
}
|
}
|
||||||
else{ cout << "hollo!" << events[i].data.fd << endl; }
|
else
|
||||||
}
|
{
|
||||||
}
|
//lookup
|
||||||
|
boost::shared_ptr<Socket> target(sockets[events[i].data.fd]);
|
||||||
|
boost::shared_ptr<Socket> source(sockets[epoll.events[target->fd]->data.fd]);
|
||||||
|
if((events[i].events & EPOLLIN )
|
||||||
|
|| (events[i].events & EPOLLPRI))
|
||||||
|
{
|
||||||
|
// read -> write
|
||||||
|
cout << "writer: "<< source->fd << endl;
|
||||||
|
cout << "reader: "<< target->fd << endl;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
int len = recv(*source, buffer, 0);
|
||||||
|
send(*target, buffer, len, 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (SocketErr e)
|
||||||
|
{
|
||||||
|
// hangup
|
||||||
|
cout << "Socket Error, closing " << target->fd << " and " << source->fd << endl;
|
||||||
|
epoll.del(target->fd);
|
||||||
|
epoll.del(source->fd);
|
||||||
|
sockets.erase(target->fd);
|
||||||
|
sockets.erase(source->fd);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if((events[i].events & EPOLLERR)
|
||||||
|
|| (events[i].events & EPOLLHUP))
|
||||||
|
{
|
||||||
|
// hangup
|
||||||
|
cout << target->fd << " closed by " << source->fd << endl;
|
||||||
|
epoll.del(target->fd);
|
||||||
|
epoll.del(source->fd);
|
||||||
|
sockets.erase(target->fd);
|
||||||
|
sockets.erase(source->fd);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue