微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ 套接字 API“心跳”

如何解决C++ 套接字 API“心跳”

我正在尝试从客户端到服务器进行简单的心跳检查,反之亦然,如果其中一个的连接意外断开,它会打印一条消息并调用 closesocket。

在这上面花了 8 个小时,但我的导师仍然不能接受。现在我得到了一些有用的东西,但是如果断点被放置在 while 循环之前并且连接的客户端被强行关闭,试图越过断点会导致崩溃,当它应该中断循环并写出错误时。

服务端代码

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,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,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;
    
}

和客户端:

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

    memset(&srv_address,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,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;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。