pond3r / ggpo

Good Game, Peace Out Rollback Network SDK
MIT License
3.17k stars 363 forks source link

WSANOTINITIALISED 10093 Error Code #68

Open hlimbo opened 2 years ago

hlimbo commented 2 years ago

Dependencies Used

Summary

When I attempt to build ggpo as a .dll and .lib file to use as a dependency for my own project, I end up receiving the following error below:

image

Looking at the code snippet below (udp.cpp):

void
Udp::SendTo(char *buffer, int len, int flags, struct sockaddr *dst, int destlen)
{
   struct sockaddr_in *to = (struct sockaddr_in *)dst;

   int res = sendto(_socket, buffer, len, flags, dst, destlen);
   if (res == SOCKET_ERROR) {
      DWORD err = WSAGetLastError();
      Log("unknown error in sendto (erro: %d  wsaerr: %d).\n", res, err);
      ASSERT(FALSE && "Unknown error in sendto");
   }
   char dst_ip[1024];
   Log("sent packet length %d to %s:%d (ret:%d).\n", len, inet_ntop(AF_INET, (void *)&to->sin_addr, dst_ip, ARRAY_SIZE(dst_ip)), ntohs(to->sin_port), res);
}

I end up getting a SOCKET_ERROR when the sendto(...) function is called. It turns out the error I get back is error code: 10093. Based on Microsoft's documentation, error code https://docs.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2, error code 10093 means that Win Sockets dependency hasn't been initialized yet.

Steps to Reproduce:

const int NUM_PLAYERS = 2; GGPOSession *ggpo = NULL;

GGPOSessionCallbacks cb = { 0 }; cb.begin_game = vw_begin_game_callback; cb.advance_frame = vw_advance_frame_callback; cb.load_game_state = vw_load_game_state_callback; cb.save_game_state = vw_save_game_state_callback; cb.free_buffer = vw_free_buffer; cb.on_event = vw_on_event_callback; cb.log_game_state = vw_log_game_state;

ggpo_start_session(&ggpo, &cb, "rollback_tech_demo", NUM_PLAYERS, sizeof(int), localPort);

ggpo_set_disconnect_timeout(ggpo, 3000); ggpo_set_disconnect_notify_start(ggpo, 1000);

// Calls to ggpo_add_player() made but omitted to keep simple

int maxTimeIdleMillis = 6; ggpo_idle(ggpo, maxTimeIdleMillis);

// sends input request over the network using UDP protocol internally // Looks like this fails because Winsockets hasn't been initialized yet. ggpo_add_local_input(ggpo, ngs.local_player_handle, &localInputsThisFrame, sizeof(localInputsThisFrame));

ggpo_synchronize_input(ggpo, (void )allInputs, sizeof(int) NUM_PLAYERS, &disconnectFlags);

ggpo_advance_frame(ggpo);

hlimbo commented 2 years ago

I have proposed a fix in a following PR: https://github.com/pond3r/ggpo/pull/69