C++ Socket API "Heartbeat"

675 views Asked by At

I'm trying to make a simple heartbeat check from client to server and vice-versa, if connection on either is broken off unexpectedly it prints a message and calls closesocket.

I spent 8 hours on this and it still isn't acceptable to my mentor. Right now I got something that works, but if breakpoint is placed before while loop and connected client is forcefully closed, trying to go past breakpoint causes crash when it should break the loop and write out error.

Server side code:

int main(int argc, char *argv[])
{
    SOCKET s, sa;
    WSAData oWSAData;
    WORD wVersion = 0x0001;
    WSAStartup(wVersion, &oWSAData);
    
    s = socket(AF_INET, SOCK_STREAM, 0);
    sockaddr_in srv_address;
    memset(&srv_address, 0, sizeof(srv_address));
    srv_address.sin_family = AF_INET;
    srv_address.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    srv_address.sin_port = htons(1099);
    
    bind(s, (sockaddr*) &srv_address, sizeof(srv_address));
    int l = listen(s, 10);
    
    if (l < 0)
        printf("Listen error\n");
    else
    {
        printf("Listen OK. Listening on port %u\n",
               htons(srv_address.sin_port));
        
        sa = accept(s, NULL, NULL);
        
        while (true)
        {
            char buffer[1000];
            
            int nRecvLen = recv(sa, buffer, 999, 0);
            buffer[nRecvLen] = '\0';
            int r = recv(sa, NULL, 0, 0);
            if (r == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET)
            {
                printf("Konekcija je naglo prekinuta!\n");
                break;
            }
            else
            {
                if (nRecvLen > 0)
                {
                    for (int i = 0; i < nRecvLen; i++)
                    {
                        cout << buffer[i];
                    }
                }
            }
        }
        closesocket(sa);
        closesocket(s);
    }
    
    WSACleanup();
    return 0;
    
}

and client side:

int main()
{
    SOCKET s;
    WSAData oWSAData;
    WORD wVersion = 0x0001;
    WSAStartup(wVersion, &oWSAData);
    
    s = socket(AF_INET, SOCK_STREAM, 0);
    sockaddr_in srv_address;

    memset(&srv_address, 0, sizeof(srv_address));
    srv_address.sin_family = AF_INET;
    srv_address.sin_addr.S_un.S_un_b.s_b1 = xxx;
    srv_address.sin_addr.S_un.S_un_b.s_b2 = xxx;
    srv_address.sin_addr.S_un.S_un_b.s_b3 = x;
    srv_address.sin_addr.S_un.S_un_b.s_b4 = xxx;
    srv_address.sin_port = htons(1099);
    
    int c = connect(s, (sockaddr*) &srv_address, sizeof(srv_address));
    
    if (c < 0)
    {
        printf("Connection error\n");
        cout << (WSAGetLastError());
    }
    else
    {
        string l = "Heartbeat\n";
        int p = l.size();
        char buff[1000];
        strcpy_s(buff, l.c_str());
        printf("Connected\n");
        
        while (true)
        {
            if (send(s, buff, p, 0) > 0)
            {
                Sleep(1000);
            }
            else
            {
                printf("Konekcija je naglo prekinuta\n");
                shutdown(s, SD_BOTH);
                closesocket(s);
                break;
            }
        }
        WSACleanup();
        return 0;
    }
}
0

There are 0 answers