@@ -332,8 +332,14 @@ int SENDTO(SOCKET s, char * buf, int len, int flags, SOCKADDR *to, int tolen, in
332332 outbuf[0 ] = static_cast <char >(psnet_type);
333333 memcpy (&outbuf[1 ], buf, static_cast <size_t >(len));
334334
335+ SOCKLEN_T addrlen = tolen;
336+
337+ if (addrlen == sizeof (SOCKADDR_STORAGE)) {
338+ addrlen = psnet_get_sockaddr_len (reinterpret_cast <SOCKADDR_STORAGE*>(to));
339+ }
340+
335341 // send it
336- return static_cast <int >( sendto (s, outbuf, len + 1 , flags, reinterpret_cast <LPSOCKADDR>(to), tolen ) );
342+ return static_cast <int >( sendto (s, outbuf, len + 1 , flags, reinterpret_cast <LPSOCKADDR>(to), addrlen ) );
337343}
338344
339345/* *
@@ -547,7 +553,7 @@ bool psnet_init_my_addr()
547553 continue ;
548554 }
549555
550- rval = connect (tsock, reinterpret_cast <LPSOCKADDR>(&remote_addr), sizeof ( remote_addr));
556+ rval = connect (tsock, reinterpret_cast <LPSOCKADDR>(&remote_addr), psnet_get_sockaddr_len (& remote_addr));
551557
552558 if (rval) {
553559 continue ;
@@ -586,7 +592,7 @@ bool psnet_init_my_addr()
586592 continue ;
587593 }
588594
589- rval = connect (tsock, reinterpret_cast <LPSOCKADDR>(&remote_addr), sizeof ( remote_addr));
595+ rval = connect (tsock, reinterpret_cast <LPSOCKADDR>(&remote_addr), psnet_get_sockaddr_len (& remote_addr));
590596
591597 if (rval) {
592598 continue ;
@@ -919,6 +925,25 @@ static void psnet_sockaddr_storage_to_in6(const SOCKADDR_STORAGE *addr, SOCKADDR
919925 }
920926}
921927
928+ /* *
929+ * @brief Helper to get the exact length of a specific protocol struct from
930+ * a generic storage struct
931+ *
932+ * @param addr
933+ * @return SOCKLEN_T
934+ */
935+ SOCKLEN_T psnet_get_sockaddr_len (const SOCKADDR_STORAGE *addr)
936+ {
937+ // internally we should always use IPv6, but cover the bases
938+ if (addr->ss_family == AF_INET6) {
939+ return static_cast <SOCKLEN_T>(sizeof (SOCKADDR_IN6));
940+ } else if (addr->ss_family == AF_INET) {
941+ return static_cast <SOCKLEN_T>(sizeof (SOCKADDR_IN));
942+ } else {
943+ return static_cast <SOCKLEN_T>(sizeof (SOCKADDR_STORAGE));
944+ }
945+ }
946+
922947/* *
923948 * Helper to map IPv4 to IPv6
924949 */
@@ -1126,6 +1151,7 @@ bool psnet_get_addr(const char *host, const char *port, SOCKADDR_STORAGE *addr,
11261151 SOCKADDR_IN6 si4to6;
11271152 int rval;
11281153
1154+ memset (addr, 0 , sizeof (*addr));
11291155 memset (&si4to6, 0 , sizeof (si4to6));
11301156
11311157 memset (&hints, 0 , sizeof (hints));
@@ -2317,9 +2343,12 @@ bool psnet_init_socket()
23172343 psnet_set_socket_options ();
23182344
23192345 // bind the socket
2320- psnet_get_addr (nullptr , Psnet_default_port, &sockaddr);
2346+ if ( !psnet_get_addr (nullptr , Psnet_default_port, &sockaddr) ) {
2347+ ml_printf (" Failed to get bind addr!" );
2348+ return false ;
2349+ }
23212350
2322- if ( bind (Psnet_socket, reinterpret_cast <LPSOCKADDR>(&sockaddr), sizeof ( sockaddr)) == SOCKET_ERROR) {
2351+ if ( bind (Psnet_socket, reinterpret_cast <LPSOCKADDR>(&sockaddr), psnet_get_sockaddr_len (& sockaddr)) == SOCKET_ERROR) {
23232352 Psnet_failure_code = WSAGetLastError ();
23242353
23252354 if (Psnet_failure_code == WSAEADDRINUSE) {
0 commit comments