However, my next problem isn't as simple as far as I can tell. In addition to sending a 'disconnect' packet if the client or server closes down, they also send heartbeats in the case that the disconnect packet does not arrive, e.g. the program crashes for any reason.
Now here's the problem scenario:
The server and client are both running.
The server sends a 'ping' every second and the client receives it.
If the client has not received a ping for 10 seconds, the server is removed from the server list.
However, if I close the server, rather than the client ceasing to receive pings, it seems to continue receiving them every single second.
I know it's simply a stack of messages in the buffer because even if I run the server for only around 2 seconds, it will continue to receive pings endlessly, and it's only sending them once a second as verified with some logging.
The server and client use a similar yet basic setup:
-Initiate winsock
-Create a socket
-Bind to port 12345 and 12346 for client and server respectively on INADDR_ANY.
-Send to a multicast address
-select() to determine if there are messages and receive them
Here's a somewhat stripped-down version of the client's receiving code:
fd_set checksockets;
checksockets.fd_count = 1;
checksockets.fd_array[0]=m_socket;
struct timeval t;
t.tv_sec=0;
t.tv_usec=0;
int waiting = select(NULL, &checksockets, NULL, NULL, &t);
// If there is at least one packet receive it.
if (waiting>0) {
sockaddr senderAddr;
int senderAddrSize = sizeof (senderAddr);
recvfrom(m_socket,buf,10000,0,&senderAddr,&senderAddrSize);
switch(((Packet*)buf)->m_type) {
case PT_SERVERPACKET: {
for (auto it = m_serverList.begin();it != m_serverList.end();++it) {
if (((sockaddr_in*)&(*it).m_address)->sin_addr.s_addr == ((sockaddr_in*)&senderAddr)->sin_addr.s_addr) {
OutputDebugString("Server ping.\n"); // Server ping!
}
}
} break;
}
}