From e6ed8f19771d23a2e3496eb8fd71187ce0acc615 Mon Sep 17 00:00:00 2001 From: dec05eba <0xdec05eba@gmail.com> Date: Wed, 6 Jun 2018 20:06:14 +0200 Subject: Add bootstrap class (server) --- src/DirectConnection.cpp | 49 +++++++++++++----------------------------------- 1 file changed, 13 insertions(+), 36 deletions(-) (limited to 'src/DirectConnection.cpp') diff --git a/src/DirectConnection.cpp b/src/DirectConnection.cpp index 6e3ddcc..86b1aa3 100644 --- a/src/DirectConnection.cpp +++ b/src/DirectConnection.cpp @@ -17,30 +17,6 @@ namespace sibs // Max received data size allowed when receiving regular data, receive data as file to receive more data const int MAX_RECEIVED_DATA_SIZE = 1024 * 1024 * 1; // 1Mb - Ipv4::Ipv4(const char *ip, u16 port) - { - struct addrinfo hints = {}; - hints.ai_flags = AI_PASSIVE; - hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_STREAM; - - char portStr[6]; - sprintf(portStr, "%d", port); - int addrInfoResult = getaddrinfo(ip, portStr, &hints, &address); - if(addrInfoResult != 0) - { - std::string errMsg = "Ip "; - errMsg += ip; - errMsg += " is not a valid ip"; - throw InvalidAddressException(errMsg); - } - } - - Ipv4::~Ipv4() - { - freeaddrinfo(address); - } - DirectConnections::DirectConnections(u16 _port) : port(_port), alive(true) @@ -63,9 +39,10 @@ namespace sibs UDT::cleanup(); } - std::shared_ptr DirectConnections::connect(const Ipv4 &address, PubSubReceiveDataCallback receiveDataCallbackFunc) + int DirectConnections::createSocket(const Ipv4 &addressToBind, bool rendezvous, bool reuseAddr) { - UDTSOCKET socket = UDT::socket(AI_PASSIVE, AF_INET, SOCK_STREAM); + Log::debug("UDT: Creating socket for ipv4 address %s, port: %d", addressToBind.getAddress().c_str(), addressToBind.getPort()); + UDTSOCKET socket = UDT::socket(AF_INET, SOCK_STREAM, IPPROTO_UDP); if(socket == UDT::INVALID_SOCK) { std::string errMsg = "UDT: Failed to create socket, error: "; @@ -73,9 +50,7 @@ namespace sibs throw ConnectionException(errMsg); } - bool rendezvous = true; UDT::setsockopt(socket, 0, UDT_RENDEZVOUS, &rendezvous, sizeof(bool)); - bool reuseAddr = true; UDT::setsockopt(socket, 0, UDT_REUSEADDR, &reuseAddr, sizeof(bool)); // Windows UDP issue @@ -84,22 +59,24 @@ namespace sibs int mss = 1052; UDT::setsockopt(socket, 0, UDT_MSS, &mss, sizeof(mss)); #endif - - sockaddr_in myAddr = {}; - myAddr.sin_family = AF_INET; - myAddr.sin_port = htons(port); - myAddr.sin_addr.s_addr = INADDR_ANY; - memset(&myAddr.sin_zero, '\0', 8); - if(UDT::bind(socket, (sockaddr*)&myAddr, sizeof(myAddr)) == UDT::ERROR) + if(UDT::bind(socket, (sockaddr*)&addressToBind.address, sizeof(addressToBind.address)) == UDT::ERROR) { std::string errMsg = "UDT: Failed to bind, error: "; errMsg += UDT::getlasterror_desc(); throw ConnectionException(errMsg); } - if(UDT::connect(socket, address.address->ai_addr, address.address->ai_addrlen) == UDT::ERROR) + return socket; + } + + std::shared_ptr DirectConnections::connect(const Ipv4 &address, PubSubReceiveDataCallback receiveDataCallbackFunc) + { + UDTSOCKET socket = createSocket(Ipv4(nullptr, port), true, true); + + if(UDT::connect(socket, (sockaddr*)&address.address, sizeof(address.address)) == UDT::ERROR) { + UDT::close(socket); std::string errMsg = "UDT: Failed to connect, error: "; errMsg += UDT::getlasterror_desc(); throw ConnectionException(errMsg); -- cgit v1.2.3