SNTP サーバーから時刻を取得する小さなプログラムを作成しました。プログラムがソケットをバインドしないという問題が発生しました。私はRFC 2030を読みました.UDP、ポート123を使用して、説明されているようにすべてを行っています。また、UDPがバインドのみの接続を必要としないことを再確認しました。私には自分の過失がわかりません。また、デバッガーから有益な情報が得られません。
これが私のコードです:
#include <stdio.h>
#include <winsock2.h>
#include <winsock.h>
#include <Ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib" )
#define BUFFSIZE 1024
int main()
{
WSADATA wsaData;
int sockfd;
char msg[48];
unsigned long buffer[BUFFSIZE];
int rv;
int counter = 0;
int numbytes;
struct addrinfo hints, *servinfo, *p;
struct sockaddr_storage their_addr;
socklen_t addr_size;
for(counter = 0; counter < 48; counter++)
msg[counter] = 0;
msg[0] = 11; //1 byte = 3 first flags set in binary: 00 001 011
msg[1] = 0;
msg[2] = 6;
msg[3] = 1;
msg[12] = 76;
msg[13] = 79;
msg[14] = 67;
msg[15] = 76;
if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0)
{
fprintf(stderr, "WSAStartup failed.\n");
exit(1);
}
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM; // Use UDP
if ((rv = getaddrinfo("ntp.belnet.be", "123", &hints, &servinfo)) != 0) {
fprintf(stderr, "Getaddrinfo: %s\n", gai_strerror(rv));
return 1;
}
// loop through all the results and make a socket
for(p = servinfo; p != NULL; p = p->ai_next) {
if ((sockfd = socket(p->ai_family, p->ai_socktype,p->ai_protocol)) == -1) {
perror("Failed to create the socket\n");
continue;
}
if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
closesocket(sockfd);
continue;
}
break;
}
if (p == NULL) {
fprintf(stderr, "Failed to bind socket\n");
return 2;
}
freeaddrinfo(servinfo);
//zenden en vragen naar de tijd
if ((numbytes = sendto(sockfd, msg, strlen(msg), 0,p->ai_addr, p->ai_addrlen)) == -1) {
perror("Couldn't send the message.\n");
exit(1);
}
addr_size = sizeof their_addr;
if ((numbytes = recvfrom(sockfd, (char *)buffer, 12 * sizeof(buffer[0]) , 0,(struct sockaddr *)&their_addr, &addr_size))== -1) {
perror("Failed Receive");
exit(1);
}
closesocket(sockfd); //close the socket
WSACleanup();
return 0;
}
誰かが私を助けることができますか?私は何を間違っていますか?
編集:ここで問題がすでに解決されていることがわかりました:
if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0)
{
fprintf(stderr, "WSAStartup failed.\n");
exit(1);
}
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM; // Use UDP
if ((rv = getaddrinfo("ntp.belnet.be", "123", &hints, &servinfo)) != 0) {
fprintf(stderr, "Getaddrinfo: %s\n", gai_strerror(rv));
return 1;
}
// loop door al de resultaten en maak de socket
for(p = servinfo; p != NULL; p = p->ai_next) {
if ((sockfd = socket(p->ai_family, p->ai_socktype,p->ai_protocol)) == -1) {
perror("Failed to create the socket\n");
continue;
}
break;
}
//zenden en vragen naar de tijd
if ((numbytes = sendto(sockfd, msg, 48, 0,p->ai_addr, p->ai_addrlen)) == -1) {
perror("Couldn't send the message.\n");
exit(1);
}
addr_size = sizeof their_addr;
if ((numbytes = recvfrom(sockfd, (char *)buffer, 48 , 0,(struct sockaddr *)&their_addr, &addr_size))== -1) {
perror("Failed Receive");
exit(1);
}