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)
105 lines
2.8 KiB
C++
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;
|
|
} |