如何解决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 举报,一经查实,本站将立刻删除。