Fix leak.
This commit is contained in:
@@ -20,14 +20,16 @@ static WSAData _wsaData;
|
||||
* Even if dualstacking is enabled it's not possible to bind an Ipv4mappedIPv6 endpoint. windows limitation
|
||||
*/
|
||||
|
||||
static Char* GetLastErrorMessage()
|
||||
static String GetLastErrorMessage()
|
||||
{
|
||||
wchar_t *s = NULL;
|
||||
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||
NULL, WSAGetLastError(),
|
||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||
(LPWSTR)&s, 0, NULL);
|
||||
return s;
|
||||
String str(s);
|
||||
LocalFree(s);
|
||||
return str;
|
||||
}
|
||||
|
||||
static int GetAddrSize(const sockaddr& addr)
|
||||
@@ -54,7 +56,7 @@ static bool CreateEndPointFromAddr(sockaddr* addr, NetworkEndPoint& endPoint)
|
||||
char service[20];
|
||||
if (getnameinfo(addr, size, name, sizeof name, service, sizeof service, 0) != 0)
|
||||
{
|
||||
LOG(Error, "Unable to extract info from sockaddr ! Error : {0}", String(GetLastErrorMessage()).Get());
|
||||
LOG(Error, "Unable to extract info from sockaddr ! Error : {0}", GetLastErrorMessage().Get());
|
||||
return true;
|
||||
}
|
||||
void* paddr;
|
||||
@@ -66,7 +68,7 @@ static bool CreateEndPointFromAddr(sockaddr* addr, NetworkEndPoint& endPoint)
|
||||
char ip[INET6_ADDRSTRLEN];
|
||||
if (inet_ntop(addr->sa_family, paddr, ip, INET6_ADDRSTRLEN) == nullptr)
|
||||
{
|
||||
LOG(Error, "Unable to extract address from sockaddr ! Error : {0}", String(GetLastErrorMessage()).Get());
|
||||
LOG(Error, "Unable to extract address from sockaddr ! Error : {0}", GetLastErrorMessage().Get());
|
||||
return true;
|
||||
}
|
||||
endPoint.Address = String(ip);
|
||||
@@ -119,34 +121,34 @@ bool Win32Network::CreateSocket(NetworkSocket& netsock, NetworkSocketCreateSetti
|
||||
|
||||
if ((sock = socket(family, stype, proto)) == INVALID_SOCKET)
|
||||
{
|
||||
LOG(Error, "Can't create native socket ! Error : {0}", String(GetLastErrorMessage()).Get());
|
||||
LOG(Error, "Can't create native socket ! Error : {0}", GetLastErrorMessage().Get());
|
||||
return true;
|
||||
}
|
||||
memcpy(netsock.Data, &sock, sizeof sock);
|
||||
DWORD dw = 0;
|
||||
if (family == AF_INET6 && setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&dw, sizeof dw) == SOCKET_ERROR)
|
||||
{
|
||||
LOG(Warning, "System does not support dual stacking socket ! Error : {0}", String(GetLastErrorMessage()).Get());
|
||||
LOG(Warning, "System does not support dual stacking socket ! Error : {0}", GetLastErrorMessage().Get());
|
||||
}
|
||||
unsigned long value = 1;
|
||||
if (settings.ReuseAddress && setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&value, sizeof value) == SOCKET_ERROR)
|
||||
{
|
||||
LOG(Warning, "Can't set socket option to SO_REUSEADDR ! Error : {0}", String(GetLastErrorMessage()).Get());
|
||||
LOG(Warning, "Can't set socket option to SO_REUSEADDR ! Error : {0}", GetLastErrorMessage().Get());
|
||||
}
|
||||
|
||||
if (settings.Broadcast && settings.Protocol == NetworkProtocolType::Udp)
|
||||
{
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&value, sizeof value) == SOCKET_ERROR)
|
||||
{
|
||||
LOG(Warning, "Can't set socket option to SO_BROADCAST ! Error : {0}", String(GetLastErrorMessage()).Get());
|
||||
LOG(Warning, "Can't set socket option to SO_BROADCAST ! Error : {0}", GetLastErrorMessage().Get());
|
||||
}
|
||||
}
|
||||
else if (settings.Broadcast)
|
||||
LOG(Warning, "Can't set socket option to SO_BROADCAST ! The socket must use UDP protocol. Error : {0}", String(GetLastErrorMessage()).Get());
|
||||
LOG(Warning, "Can't set socket option to SO_BROADCAST ! The socket must use UDP protocol. Error : {0}", GetLastErrorMessage().Get());
|
||||
|
||||
if (ioctlsocket(sock, FIONBIO, &value) == SOCKET_ERROR)
|
||||
{
|
||||
LOG(Error, "Can't set socket to NON-BLOCKING type ! Error : {0}", String(GetLastErrorMessage()).Get());
|
||||
LOG(Error, "Can't set socket to NON-BLOCKING type ! Error : {0}", GetLastErrorMessage().Get());
|
||||
return true; // Support using blocking socket , need to test it
|
||||
}
|
||||
//DEBUG
|
||||
@@ -193,7 +195,7 @@ bool Win32Network::BindSocket(NetworkSocket& socket, NetworkEndPoint& endPoint)
|
||||
LOG(Info, "BIND : EndPoint family : {0}", addr->sa_family);
|
||||
if (bind(*(SOCKET*)socket.Data, (const sockaddr*)endPoint.Data, size) == SOCKET_ERROR)
|
||||
{
|
||||
LOG(Error, "Unable to bind socket ! Socket : {0} Address : {1} Port : {2} Error : {3}", *(SOCKET*)socket.Data, endPoint.Address.Get(), endPoint.Port.Get(), String(GetLastErrorMessage()).Get());
|
||||
LOG(Error, "Unable to bind socket ! Socket : {0} Address : {1} Port : {2} Error : {3}", *(SOCKET*)socket.Data, endPoint.Address.Get(), endPoint.Port.Get(), GetLastErrorMessage().Get());
|
||||
return true;
|
||||
}
|
||||
//DEBUG
|
||||
@@ -212,7 +214,7 @@ bool Win32Network::Accept(NetworkSocket& serverSock, NetworkSocket& newSock, Net
|
||||
sockaddr addr;
|
||||
if ((sock = accept(*(SOCKET*)serverSock.Data, &addr, nullptr)) == INVALID_SOCKET)
|
||||
{
|
||||
LOG(Warning, "Unable to accept incoming connection ! Socket : {0} Error : {1}", *(SOCKET*)serverSock.Data, String(GetLastErrorMessage()).Get());
|
||||
LOG(Warning, "Unable to accept incoming connection ! Socket : {0} Error : {1}", *(SOCKET*)serverSock.Data, GetLastErrorMessage().Get());
|
||||
return true;
|
||||
}
|
||||
memcpy(newSock.Data, &sock, sizeof sock);
|
||||
@@ -230,7 +232,7 @@ bool Win32Network::IsReadable(NetworkSocket& socket, uint64* size)
|
||||
unsigned long value;
|
||||
if (ioctlsocket(*(SOCKET*)socket.Data, FIONREAD, &value) != 0)
|
||||
{
|
||||
LOG(Error, "Unable to query socket for readability ! Socket : {0} Error : {1}", *(SOCKET*)socket.Data, String(GetLastErrorMessage()).Get());
|
||||
LOG(Error, "Unable to query socket for readability ! Socket : {0} Error : {1}", *(SOCKET*)socket.Data, GetLastErrorMessage().Get());
|
||||
return true;
|
||||
}
|
||||
*size = value;
|
||||
@@ -249,7 +251,7 @@ int32 Win32Network::WriteSocket(NetworkSocket socket, byte* data, uint32 length,
|
||||
{
|
||||
if ((size = send(*(SOCKET*)socket.Data, (const char*)data, length, 0)) == SOCKET_ERROR)
|
||||
{
|
||||
LOG(Error, "Unable to send data ! Socket : {0} Data Length : {1} Error : {2}", *(SOCKET*)socket.Data, length, String(GetLastErrorMessage()).Get());
|
||||
LOG(Error, "Unable to send data ! Socket : {0} Data Length : {1} Error : {2}", *(SOCKET*)socket.Data, length, GetLastErrorMessage().Get());
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -257,7 +259,7 @@ int32 Win32Network::WriteSocket(NetworkSocket socket, byte* data, uint32 length,
|
||||
{
|
||||
if ((size = sendto(*(SOCKET*)socket.Data, (const char*)data, length, 0, (const sockaddr*)endPoint->Data, GetAddrSizeFromEP(*endPoint))) == SOCKET_ERROR)
|
||||
{
|
||||
LOG(Error, "Unable to send data ! Socket : {0} Address : {1} Port : {2} Data Length : {3} Error : {4}", *(SOCKET*)socket.Data, endPoint->Address, endPoint->Port, length, String(GetLastErrorMessage()).Get());
|
||||
LOG(Error, "Unable to send data ! Socket : {0} Address : {1} Port : {2} Data Length : {3} Error : {4}", *(SOCKET*)socket.Data, endPoint->Address, endPoint->Port, length, GetLastErrorMessage().Get());
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -280,7 +282,7 @@ int32 Win32Network::ReadSocket(NetworkSocket socket, byte* buffer, uint32 buffer
|
||||
{
|
||||
if ((size = recv(*(SOCKET*)socket.Data, (char*) buffer, bufferSize, 0)) == SOCKET_ERROR)
|
||||
{
|
||||
LOG(Error, "Unable to read data ! Socket : {0} Buffer Size : {1} Error : {2}", *(SOCKET*)socket.Data, bufferSize, String(GetLastErrorMessage()).Get());
|
||||
LOG(Error, "Unable to read data ! Socket : {0} Buffer Size : {1} Error : {2}", *(SOCKET*)socket.Data, bufferSize, GetLastErrorMessage().Get());
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -290,7 +292,7 @@ int32 Win32Network::ReadSocket(NetworkSocket socket, byte* buffer, uint32 buffer
|
||||
sockaddr_in6 addr;
|
||||
if ((size = recvfrom(*(SOCKET*)socket.Data, (char*) buffer, bufferSize, 0, (sockaddr*)&addr, &addrsize)) == SOCKET_ERROR)
|
||||
{
|
||||
LOG(Error, "Unable to read data ! Socket : {0} Buffer Size : {1} Error : {2}", *(SOCKET*)socket.Data, bufferSize, String(GetLastErrorMessage()).Get());
|
||||
LOG(Error, "Unable to read data ! Socket : {0} Buffer Size : {1} Error : {2}", *(SOCKET*)socket.Data, bufferSize, GetLastErrorMessage().Get());
|
||||
return -1;
|
||||
}
|
||||
if (CreateEndPointFromAddr((sockaddr*)&addr, *endPoint))
|
||||
|
||||
Reference in New Issue
Block a user