繁体   English   中英

Sendto函数返回错误-Windows上的UDP套接字

[英]Sendto function return error - UDP socket on windows

我对sendto函数有问题。 我想从UDP服务器获取时间。 我的代码是这样的:

unsigned char msg[48]={010,0,0,0,0,0,0,0,0};
char* hostname=(char *)"tick.usno.navy.mil";
sockaddr_in server_addr;
WSAData data;
int result=WSAStartup( MAKEWORD( 2, 2 ), &data );
if (result != NO_ERROR) {
    printf("WSAStartup failed with error: %d\n", result);
    return 1;
}
int client_s = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP);
if (client_s == INVALID_SOCKET) {
    printf("socket failed with error: %ld\n", WSAGetLastError());
    WSACleanup();
    return 1;
}
unsigned short Port = 123;
server_addr.sin_family = AF_INET;                 // Address family to use
server_addr.sin_port = htons(Port);           // Port num to use
server_addr.sin_addr.s_addr = inet_addr(hostname); // IP address to use
char out_buf[BUFFER_SIZE];
int retcode = sendto(client_s, reinterpret_cast<const char*>(msg), sizeof(msg), 0,(struct sockaddr *)&server_addr, sizeof(server_addr));
perror("sendto:");
if (retcode == SOCKET_ERROR) {
    printf("sendto failed with error: %d\n", WSAGetLastError());
    closesocket(client_s);
    WSACleanup();
    return 1;
}

我的输出是这样的:

sendto:: No error
sendto failed with error: 10013

当我使用recv尝试接收数据时,出现了问题。 我想用c ++从Windows上的UDP服务器获取时间。 这里哪里有问题? 为什么一个错误说没有错误,一个错误说10013,我该如何解决?

旧答案(保留在下面)仅供参考,但不适用于这种情况。

问题很可能是这两行

char* hostname=(char *)"tick.usno.navy.mil";
...
server_addr.sin_addr.s_addr = inet_addr(hostname); // IP address to use

inet_addr函数需要一个点分十进制的IPv4地址。 不是无法解析的主机名。 如果没有提供有效的IPv4点分十进制地址,该函数将返回INADDR_NONE ,该地址不是有效地址,并且在使用INADDR_NONE sendto的地址时会导致问题。 会导致问题中报告的错误吗? 老实说,我不知道,但是它肯定不会按预期工作。

要将主机名解析为IP地址,应使用getaddrinfo 链接的参考还包含有关如何使用它的示例。


错误10013是(例如,如果您查看此Windows套接字错误参考 WSAEACCESS ),则存在一些权限问题。 如果稍稍搜索一下,您会发现1024以下的端口已为系统保留,并且需要提升的特权才能使用它们。

如果要创建NTP服务器或客户端,则需要使用提升的访问权限来运行程序,例如,使用“以管理员身份运行”。


至于留言

sendto:: No error

它来自sendto之后无条件调用的perror调用。 首先,在Windows上,套接字函数未设置perror使用的errno 其次,如果先前的调用实际上没有失败,则errno的状态不确定。

因此,请勿无条件使用它,也不要将其用于Windows套接字功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM