- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当我没有互联网连接时,为什么 socket()
不返回 INVALID_SOCKET
?我以为它会失败然后我可以退出我的功能。我的函数的错误检查一直持续到 recvfrom()
,然后在我没有互联网连接时挂起。我以为 socket()
或 sendto()
会在我没有互联网连接时返回错误代码,但事实并非如此。我试图依靠他们的失败作为用户没有互联网连接并退出我的功能的标志,但那只是因为一些奇怪的原因而不起作用。
void myFunc()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("myipaddress");
server_addr.sin_port = htons(123);
// Doesn't fail when there's no internet connection
protoent *proto = getprotobyname("udp");
int s = socket(PF_INET, SOCK_DGRAM, proto->p_proto);
if (s == INVALID_SOCKET) {
goto Cleanup;
}
// Doesn't fail when there's no internet connection
char msg[48] = { 0x08, 0, 0, 0, 0, 0, 0, 0, 0 };
int iResult = sendto(s, msg, sizeof(msg), 0, (struct sockaddr *) &server_addr, sizeof(server_addr));
if (iResult == SOCKET_ERROR) {
goto Cleanup;
}
// Hangs when there's no internet connection
memset(msg, 0, sizeof(msg));
struct sockaddr saddr;
socklen_t saddr_l = sizeof(saddr);
iResult = recvfrom(s, msg, 48, 0, &saddr, &saddr_l);
if (iResult == SOCKET_ERROR) {
goto Cleanup;
}
Cleanup:
closesocket(s);
WSACleanup();
}
最佳答案
因为不需要套接字连接到互联网。许多应用程序使用套接字在单台机器上进行进程间通信。当没有互联网连接时,此类应用程序仍然可以正常运行。
sendto()
可以返回一个错误代码;它可以(在某些情况下,如有关网络连接状态的桌面通知所示)知道数据包永远无法传递。但是,UDP 通信和 sendto()
不保证任何交付,显然您正在使用的实现不考虑缺少值得错误代码的连接。可以说这是实现质量问题。
recvfrom()
只是等待您为消息指定的时间(可能无限期地),但永远不会收到消息。同样,这在规范范围内,并且无论是否标记了这种特定情况,都可以将其视为实现质量问题。
关于c++ - 当没有互联网连接时,socket() 和 sendto() 不返回错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38681543/
我正在使用 Gunicorn 为 Django 应用程序提供服务,它工作正常,直到我将其超时时间从 30 秒更改为 900000 秒,我不得不这样做,因为我有一个用例需要上传和处理一个巨大的文件(过程
我有一个带有非常基本的管道的Jenkinsfile,它可以旋转docker容器: pipeline { agent { dockerfile { args '-u root' } } stag
在学习 MEAN 堆栈的过程中,我遇到了一个问题。每当我尝试使用 Passport 验证方法时,它都不会返回任何响应。我总是收到“localhost没有发送任何数据。ERR_EMPTY_RESPONS
在当今的大多数企业堆栈中,数据库是我们存储所有秘密的地方。它是安全屋,是待命室,也是用于存储可能非常私密或极具价值的物品的集散地。对于依赖它的数据库管理员、程序员和DevOps团队来说,保护它免受所
是否可以创建像图片上那样的边框?只需使用 css 边框属性。最终结果将是没 Angular 盒子。我不想添加额外的 html 元素。我只想为每个 li 元素添加 css 边框信息。 假设这是一个 ul
我是一名优秀的程序员,十分优秀!