frnetlib/main.cpp
Fred Nicolson a3eb2ccd0a Added raw send and receive. Fixed TcpSocket close bug.
Can now send and receive raw data over TcpSockets for communicating with other protocols, such as HTTP.

Fixed TcpSocket::close only calling close() if the connection isn't open (gg wp)
2016-12-10 12:59:07 +00:00

105 lines
2.8 KiB
C++

#include <iostream>
#include <Packet.h>
#include <TcpSocket.h>
#include <TcpListener.h>
#include <SocketSelector.h>
#include <thread>
#include <atomic>
#include <vector>
void server()
{
fr::TcpListener listener;
if(listener.listen("8081") != fr::Socket::Success)
{
std::cout << "Failed to listen to port" << std::endl;
return;
}
fr::SocketSelector selector;
std::vector<std::unique_ptr<fr::TcpSocket>> clients;
selector.add(listener);
while(selector.wait())
{
if(selector.is_ready(listener))
{
clients.emplace_back(new fr::TcpSocket());
if(listener.accept(*clients.back()) != fr::Socket::Success)
{
clients.pop_back();
continue;
}
selector.add(*clients.back());
std::cout << "Got new connection from: " << clients.back()->get_remote_address() << std::endl;
}
else
{
for(auto iter = clients.begin(); iter != clients.end();)
{
if(selector.is_ready(**iter))
{
std::string message(1024, '\0');
size_t received;
if((*iter)->receive_raw(&message[0], 1024, received) == fr::Socket::Success)
{
std::cout << (*iter)->get_remote_address() << " sent: " << message.substr(0, received) << std::endl;
message.clear();
message = "HTTP/1.1 " + std::to_string(200) + " \r\nConnection: close\r\nContent-type: text/html\r\n\r\n<h1>Hey</h1>\r\n";
(*iter)->send_raw(&message[0], message.size());
std::cout << "Sent" << std::endl;
(*iter)->close();
}
else
{
std::cout << (*iter)->get_remote_address() << " has disconnected." << std::endl;
selector.remove(*iter->get());
iter = clients.erase(iter);
}
}
else
{
iter++;
}
}
}
}
}
void client()
{
// fr::TcpSocket socket;
// socket.connect("127.0.0.1", "8081");
//
// fr::TcpSocket socket2;
// socket2.connect("127.0.0.1", "8081");
//
// fr::Packet packet;
// packet << "Hello, World! - From socket 1";
// socket.send(packet);
//
// packet.clear();
// packet << "Hello, world! - From socket 2";
// socket2.send(packet);
return;
}
int main()
{
std::thread t1(&server);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
auto start = std::chrono::system_clock::now();
std::thread t2(&client);
t1.join();
return 0;
}