【发布时间】:2020-12-31 04:16:50
【问题描述】:
我已经建立了一个 Winsock2 连接,但我需要涵盖互联网中断的情况。这是我的代码;
#include <winsock2.h>
#include <windows.h>
#include <ctime>
int main()
{
WSADATA w;
if(WSAStartup(MAKEWORD(2,2),&w)) return 0;
sockaddr_in sad;
sad.sin_family=AF_INET;
sad.sin_addr.s_addr=inet_addr("200.20.186.76");
sad.sin_port=htons(123);
sockaddr saddr;
int saddr_l=sizeof(saddr);
int s=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(s==INVALID_SOCKET) return 0;
char msg[48]={8};
if(sendto(s,msg,sizeof(msg),0,(sockaddr*)&sad,sizeof(sad))==SOCKET_ERROR) return 0;
if(recvfrom(s,msg,48,0,&saddr,&saddr_l)==SOCKET_ERROR) return 0;
if(closesocket(s)==SOCKET_ERROR) return 0;
if(WSACleanup()) return 0;
return 0;
}
在这里它等待调用返回,因为它记录在案。我有两个问题。
- 我可以像使用
select时那样设置超时吗 - 我还能如何防止等待并使其立即返回?文档指出:
当发出诸如 sendto 之类的阻塞 Winsock 调用时,Winsock 可能需要等待网络事件才能完成调用。在这种情况下,Winsock 会执行警报等待,该等待可能会被安排在同一线程上的异步过程调用 (APC) 中断。
怎么做?
【问题讨论】:
-
AFAIK 无法检测到带有 UDP 的套接字的连接丢失,因为它是无连接的。您需要对此使用一些解决方法。
-
@UltimaWeapon 好的,谢谢。我会先尝试 ping 某处或考虑其他事情。
-
使用读取超时,
setsockopt()和SO_RCVTIMEO。 -
@user207421 我已经看过那些文档页面,但它们需要面向连接的协议,如 TCP。我使用的是 UDP,它是无连接的,所以这些方法可能不起作用。
-
"我可以像使用
select时那样设置超时" - 您可以将select()与 UDP 套接字一起使用。仅供参考,SO_RCVTIMEO也适用于 UDP。
标签: c++ winapi winsock winsock2