aboutsummaryrefslogtreecommitdiff
path: root/src/DirectConnection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/DirectConnection.cpp')
-rw-r--r--src/DirectConnection.cpp49
1 files changed, 13 insertions, 36 deletions
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<DirectConnectionPeer> 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<DirectConnectionPeer> 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);