From fbf0f0e73072d9c1b50bcf270f059653f3a338a7 Mon Sep 17 00:00:00 2001 From: harou24 Date: Mon, 4 Apr 2022 17:23:32 +0200 Subject: [PATCH 1/4] done --- apps/CMakeLists.txt | 3 +++ apps/tcpStream.cpp | 24 ++++++++++++++++++++++++ src/tcp/TcpStream.hpp | 22 ++++++++++------------ tests/tcp_stream.cpp | 13 +++++++++++++ 4 files changed, 50 insertions(+), 12 deletions(-) create mode 100644 apps/tcpStream.cpp create mode 100644 tests/tcp_stream.cpp diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index d9f97b6..34c0025 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -17,3 +17,6 @@ target_link_libraries(irc PRIVATE ft_irc) add_executable(infinite_loop.out infinite_loop.cpp) add_executable(stop_loop.out stop_loop.cpp) + +add_executable(tcpStream.out tcpStream.cpp) +target_link_libraries(tcpStream.out PRIVATE ft_irc) \ No newline at end of file diff --git a/apps/tcpStream.cpp b/apps/tcpStream.cpp new file mode 100644 index 0000000..e1a995a --- /dev/null +++ b/apps/tcpStream.cpp @@ -0,0 +1,24 @@ +#include "TcpStream.hpp" + +#include + +int main(void) +{ +// int listenSd = socket(AF_INET, SOCK_STREAM, 0); + + struct sockaddr_in address; +// socklen_t length = sizeof(address); + memset(&address, 0, sizeof(address)); + + // int sd = ::accept(_mListenSd, (struct sockaddr*)&address, &length); + TcpStream stream(0, &address); + + int nbSend = stream.send("Hello\n", 6); + assert(nbSend == 6); + char buffer[42]; + int nbRec = stream.receive(buffer, sizeof(buffer)); + buffer[nbRec] = '\0'; + std::cout << buffer << std::endl; + + return (0); +} \ No newline at end of file diff --git a/src/tcp/TcpStream.hpp b/src/tcp/TcpStream.hpp index e06c0d1..b3defc0 100644 --- a/src/tcp/TcpStream.hpp +++ b/src/tcp/TcpStream.hpp @@ -9,16 +9,6 @@ class TcpStream { - public: - ~TcpStream(); - - ssize_t send(std::string buffer, size_t len); - ssize_t receive(char* buffer, size_t len); - - std::string getPeerIP() const; - int getPeerPort() const; - int getSd() const; - private: int _mSd; std::string _mPeerIP; @@ -28,11 +18,19 @@ class TcpStream TcpStream(); TcpStream(int sd, struct sockaddr_in* address); TcpStream(const TcpStream& src); + ~TcpStream(); + + ssize_t send(std::string buffer, size_t len); + ssize_t receive(char* buffer, size_t len); + + std::string getPeerIP() const; + int getPeerPort() const; + int getSd() const; - TcpStream& operator=(const TcpStream& src); + TcpStream& operator = (const TcpStream& src); }; -std::ostream& operator<<(std::ostream& o , TcpStream const & src); +std::ostream& operator << (std::ostream& o , TcpStream const & src); #endif \ No newline at end of file diff --git a/tests/tcp_stream.cpp b/tests/tcp_stream.cpp new file mode 100644 index 0000000..f3b8c10 --- /dev/null +++ b/tests/tcp_stream.cpp @@ -0,0 +1,13 @@ +#include +#include "TcpStream.hpp" + +TEST_CASE("Test constructor") +{ + struct sockaddr_in address; + memset(&address, 0, sizeof(address)); + TcpStream stream(5, &address); + + REQUIRE(stream.getSd() == 5); + REQUIRE(stream.getPeerIP() == "0.0.0.0"); + REQUIRE(stream.getPeerPort() == 0); +} \ No newline at end of file From 1281aae8336f1b5a9965b32cc24c76e9b529dc45 Mon Sep 17 00:00:00 2001 From: Evita Overtoom Date: Mon, 4 Apr 2022 21:00:35 +0200 Subject: [PATCH 2/4] save --- apps/CMakeLists.txt | 5 +++-- apps/{server.cpp => tcpAcceptor.cpp} | 0 apps/tcpStream.cpp | 17 +++++++--------- src/tcp/TcpAcceptor.cpp | 27 ++++++++++++++++--------- src/tcp/TcpAcceptor.hpp | 9 ++++++--- src/tcp/TcpStream.cpp | 4 +--- tests/tcp_acceptor.cpp | 30 ++++++++++++++++++++++++++++ tests/tcp_stream.cpp | 12 +++++++++++ 8 files changed, 77 insertions(+), 27 deletions(-) rename apps/{server.cpp => tcpAcceptor.cpp} (100%) create mode 100644 tests/tcp_acceptor.cpp diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index 34c0025..14f9003 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -4,8 +4,10 @@ target_link_libraries(table.out PRIVATE ft_irc) add_executable(parser.out parser.cpp) target_link_libraries(parser.out PRIVATE ft_irc) -add_executable(echo_server server.cpp) +add_executable(echo_server tcpAcceptor.cpp) add_executable(echo_client client.cpp) +add_executable(tcpStream.out tcpStream.cpp) + add_executable(server multiserver.cpp) add_executable(irc irc.cpp) @@ -18,5 +20,4 @@ target_link_libraries(irc PRIVATE ft_irc) add_executable(infinite_loop.out infinite_loop.cpp) add_executable(stop_loop.out stop_loop.cpp) -add_executable(tcpStream.out tcpStream.cpp) target_link_libraries(tcpStream.out PRIVATE ft_irc) \ No newline at end of file diff --git a/apps/server.cpp b/apps/tcpAcceptor.cpp similarity index 100% rename from apps/server.cpp rename to apps/tcpAcceptor.cpp diff --git a/apps/tcpStream.cpp b/apps/tcpStream.cpp index e1a995a..bca2fa8 100644 --- a/apps/tcpStream.cpp +++ b/apps/tcpStream.cpp @@ -1,24 +1,21 @@ #include "TcpStream.hpp" #include +#include +#include int main(void) { -// int listenSd = socket(AF_INET, SOCK_STREAM, 0); - struct sockaddr_in address; -// socklen_t length = sizeof(address); memset(&address, 0, sizeof(address)); - // int sd = ::accept(_mListenSd, (struct sockaddr*)&address, &length); TcpStream stream(0, &address); - int nbSend = stream.send("Hello\n", 6); - assert(nbSend == 6); - char buffer[42]; - int nbRec = stream.receive(buffer, sizeof(buffer)); - buffer[nbRec] = '\0'; - std::cout << buffer << std::endl; + int nbSend = stream.send("Give a world of 6letters\n", 26); + assert(nbSend == 26); + char buffer[420]; + int nbRec = stream.receive(buffer, sizeof(buffer)); + assert(nbRec == 7); return (0); } \ No newline at end of file diff --git a/src/tcp/TcpAcceptor.cpp b/src/tcp/TcpAcceptor.cpp index c3b9a00..5e7c4e2 100644 --- a/src/tcp/TcpAcceptor.cpp +++ b/src/tcp/TcpAcceptor.cpp @@ -9,9 +9,9 @@ TcpAcceptor::~TcpAcceptor(){ close(_mListenSd); } -int TcpAcceptor::init(){ +void TcpAcceptor::init(){ if (_mListening == true) - return 0; + return; createListenSocket(); @@ -20,12 +20,11 @@ int TcpAcceptor::init(){ setSocketOptions(); - int result = bindSocket(&address); + bindSocket(&address); - result = setSocketListen(); + setSocketListen(); _mListening = true; - return result; } TcpStream* TcpAcceptor::accept(){ @@ -45,6 +44,18 @@ int TcpAcceptor::getListenSd() const{ return _mListenSd; } +std::string TcpAcceptor::getAddress() const{ + return _mAddress; +} + +int TcpAcceptor::getPort() const{ + return _mPort; +} + +bool TcpAcceptor::isListening() const { + return _mListening; +} + void TcpAcceptor::createListenSocket(){ _mListenSd = socket(AF_INET, SOCK_STREAM, 0); } @@ -56,18 +67,16 @@ void TcpAcceptor::inetSocketAddress(struct sockaddr_in *address){ address->sin_addr.s_addr = inet_addr(_mAddress.c_str()); } -int TcpAcceptor::bindSocket(struct sockaddr_in *address){ +void TcpAcceptor::bindSocket(struct sockaddr_in *address){ int result = bind(_mListenSd, (struct sockaddr*)address, sizeof(*address)); if (result != 0) throw std::runtime_error("bind failed"); - return result; } -int TcpAcceptor::setSocketListen(){ +void TcpAcceptor::setSocketListen(){ int result = listen(_mListenSd, 16); if (result != 0) throw std::runtime_error("listen failed"); - return result; } void TcpAcceptor::setSocketOptions(){ diff --git a/src/tcp/TcpAcceptor.hpp b/src/tcp/TcpAcceptor.hpp index e1c5e4b..93dd574 100644 --- a/src/tcp/TcpAcceptor.hpp +++ b/src/tcp/TcpAcceptor.hpp @@ -11,9 +11,12 @@ class TcpAcceptor{ TcpAcceptor(int port, std::string address); ~TcpAcceptor(); - int init(); + void init(); TcpStream* accept(); int getListenSd() const; + int getPort() const; + std::string getAddress() const; + bool isListening() const; private: int _mListenSd; @@ -25,9 +28,9 @@ class TcpAcceptor{ TcpAcceptor(); void createListenSocket(); - int bindSocket(struct sockaddr_in *address); + void bindSocket(struct sockaddr_in *address); void inetSocketAddress(struct sockaddr_in *address); - int setSocketListen(); + void setSocketListen(); void setSocketOptions(); }; diff --git a/src/tcp/TcpStream.cpp b/src/tcp/TcpStream.cpp index 62034d2..3a9f038 100644 --- a/src/tcp/TcpStream.cpp +++ b/src/tcp/TcpStream.cpp @@ -9,9 +9,7 @@ TcpStream::TcpStream(int sd, struct sockaddr_in* address){ } TcpStream::TcpStream(const TcpStream& src){ - _mPeerPort = src.getPeerPort(); - _mPeerIP = src.getPeerIP(); - _mSd = src._mSd; + *this = src; } TcpStream& TcpStream::operator=(const TcpStream& src){ diff --git a/tests/tcp_acceptor.cpp b/tests/tcp_acceptor.cpp new file mode 100644 index 0000000..71b3371 --- /dev/null +++ b/tests/tcp_acceptor.cpp @@ -0,0 +1,30 @@ +#include +#include "TcpAcceptor.hpp" + +TEST_CASE("Test constructor") +{ + TcpAcceptor acceptor(8080, "127.0.0.1"); + + REQUIRE(acceptor.getListenSd() == 0); + REQUIRE(acceptor.getPort() == 8080); + REQUIRE(acceptor.getAddress() == "127.0.0.1"); +} + +TEST_CASE("Test init"){ + TcpAcceptor acceptor(8080, "127.0.0.1"); + + acceptor.init(); + + REQUIRE(acceptor.getListenSd() > 2); + REQUIRE(acceptor.isListening()); +} + +TEST_CASE("Test listen"){ + TcpAcceptor acceptor(8080, "127.0.0.1"); + int val; + socklen_t length = sizeof(val); + + acceptor.init(); + getsockopt(acceptor.getListenSd(), SOL_SOCKET, SO_ACCEPTCONN, &val, &length); + REQUIRE(val); +} \ No newline at end of file diff --git a/tests/tcp_stream.cpp b/tests/tcp_stream.cpp index f3b8c10..ec42723 100644 --- a/tests/tcp_stream.cpp +++ b/tests/tcp_stream.cpp @@ -10,4 +10,16 @@ TEST_CASE("Test constructor") REQUIRE(stream.getSd() == 5); REQUIRE(stream.getPeerIP() == "0.0.0.0"); REQUIRE(stream.getPeerPort() == 0); +} + +TEST_CASE("Test CopyConstructor") +{ + struct sockaddr_in address; + memset(&address, 0, sizeof(address)); + TcpStream stream(5, &address); + + TcpStream copy(stream); + REQUIRE(copy.getSd() == 5); + REQUIRE(copy.getPeerIP() == "0.0.0.0"); + REQUIRE(copy.getPeerPort() == 0); } \ No newline at end of file From 1713063b47505b31de25b34bfd3e2845c8c7e8f0 Mon Sep 17 00:00:00 2001 From: Evita Overtoom Date: Tue, 5 Apr 2022 19:23:07 +0200 Subject: [PATCH 3/4] save --- apps/CMakeLists.txt | 2 +- apps/tcpAcceptor.cpp | 3 +++ apps/{client.cpp => tcpConnector.cpp} | 2 ++ src/tcp/TcpAcceptor.cpp | 2 +- tests/tcp_acceptor.cpp | 18 ++++++++++++++++++ 5 files changed, 25 insertions(+), 2 deletions(-) rename apps/{client.cpp => tcpConnector.cpp} (93%) diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index 14f9003..e1055ec 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -5,7 +5,7 @@ add_executable(parser.out parser.cpp) target_link_libraries(parser.out PRIVATE ft_irc) add_executable(echo_server tcpAcceptor.cpp) -add_executable(echo_client client.cpp) +add_executable(echo_client tcpConnector.cpp) add_executable(tcpStream.out tcpStream.cpp) add_executable(server multiserver.cpp) diff --git a/apps/tcpAcceptor.cpp b/apps/tcpAcceptor.cpp index 3c4eea5..4027c70 100644 --- a/apps/tcpAcceptor.cpp +++ b/apps/tcpAcceptor.cpp @@ -55,6 +55,7 @@ int main(int argc, char **argv) try{ stream = server.accept(); if (stream){ + assert(stream->getPeerIP() == "127.0.0.1"); size_t len; char buffer[256]; while ((len = stream->receive(buffer, sizeof(buffer))) > 0){ @@ -64,6 +65,8 @@ int main(int argc, char **argv) } delete stream; } + else + assert(stream == NULL); } catch(std::exception &e){ printException(e); diff --git a/apps/client.cpp b/apps/tcpConnector.cpp similarity index 93% rename from apps/client.cpp rename to apps/tcpConnector.cpp index 8b76f45..bb3a8d9 100644 --- a/apps/client.cpp +++ b/apps/tcpConnector.cpp @@ -41,6 +41,8 @@ void basicTest(TcpConnector &connector, char **argv, std::string message){ try{ TcpStream* stream = connector.connect(atoi(argv[1]), argv[2]); if (stream) { + assert(stream->getPeerIP() == argv[2]); + assert(stream->getPeerPort() == atoi(argv[1])); send(message, *stream); receive(*stream); delete stream; diff --git a/src/tcp/TcpAcceptor.cpp b/src/tcp/TcpAcceptor.cpp index 5e7c4e2..aafc9f0 100644 --- a/src/tcp/TcpAcceptor.cpp +++ b/src/tcp/TcpAcceptor.cpp @@ -82,7 +82,7 @@ void TcpAcceptor::setSocketListen(){ void TcpAcceptor::setSocketOptions(){ //makes it possible to immidetly listen on same adddress and port when restart server int optval = 1; - setsockopt(_mListenSd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval); + setsockopt(_mListenSd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)); } std::ostream& operator<<(std::ostream& o, TcpAcceptor const& src){ diff --git a/tests/tcp_acceptor.cpp b/tests/tcp_acceptor.cpp index 71b3371..0e83d2f 100644 --- a/tests/tcp_acceptor.cpp +++ b/tests/tcp_acceptor.cpp @@ -27,4 +27,22 @@ TEST_CASE("Test listen"){ acceptor.init(); getsockopt(acceptor.getListenSd(), SOL_SOCKET, SO_ACCEPTCONN, &val, &length); REQUIRE(val); +} + +TEST_CASE("Test bind"){ + TcpAcceptor acceptor(8080, "127.0.0.1"); + + struct sockaddr_in address; + memset(&address, 0, sizeof(address)); + socklen_t length = sizeof(address); + + getsockname(acceptor.getListenSd(), (struct sockaddr*)&address, &length); + std::string adr = inet_ntoa(address.sin_addr); + REQUIRE(adr == "0.0.0.0"); + + acceptor.init(); + int val = getsockname(acceptor.getListenSd(), (struct sockaddr*)&address, &length); + adr = inet_ntoa(address.sin_addr); + REQUIRE(val == 0); + REQUIRE(adr == "127.0.0.1"); } \ No newline at end of file From ff39602448796721b8a987d93656d88aee18befe Mon Sep 17 00:00:00 2001 From: Evita Overtoom Date: Wed, 6 Apr 2022 12:09:15 +0200 Subject: [PATCH 4/4] added lib for linux --- src/tcp/TcpAcceptor.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tcp/TcpAcceptor.hpp b/src/tcp/TcpAcceptor.hpp index 93dd574..877853a 100644 --- a/src/tcp/TcpAcceptor.hpp +++ b/src/tcp/TcpAcceptor.hpp @@ -5,6 +5,7 @@ #include #include #include +#include class TcpAcceptor{ public: