我目前正在学习C,我无法理解以下代码:
struct dns_header
{
unsigned char ra : 1;
unsigned char z : 1;
unsigned char ad : 1;
unsigned char cd : 1;
unsigned char rcode : 4;
unsigned short q_count : 16;
};
int main(void)
{
struct dns_header *ptr;
unsigned char buffer[256];
ptr = (struct dns_header *) &buffer;
ptr->ra = 0;
ptr->z = 0;
ptr->ad = 0;
ptr->cd = 0;
ptr->rcode = 0;
ptr->q_count = htons(1);
}
Run Code Online (Sandbox Code Playgroud)
我不明白的是 ptr = (struct dns_header *) &buffer;
任何人都可以详细解释这个吗?
我正在通过编写一个将DNS查询发送到指定服务器的小应用程序来学习C. 以下是网络代码的示例:
int send_query()
{
int sockfd;
struct sockaddr_in server;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
perror("cannot create socket\n");
}
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(53);
inet_pton(AF_INET, "8.8.8.8", &(server.sin_addr));
sendto(sockfd, const void *buffer, size_t length, 0, (struct sockaddr *) &server, sizeof(server));
}
Run Code Online (Sandbox Code Playgroud)
这可以正常工作,因为查询已成功发送,并收到回复.但是,通过使用Wireshark嗅探流量,我可以看到以下消息:Destination unreachable (Port unreachable).
我发现我可以通过调用避免此bind()之前sendto():
int send_query()
{
int sockfd;
struct sockaddr_in server;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
perror("cannot create socket\n");
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试以毫秒为单位测量时间:
#include <stdio.h>
#include <time.h>
int main(void)
{
int i;
struct timespec start, end;
for (i = 0; i < 10; i++) {
clock_gettime(CLOCK_MONOTONIC, &start);
usleep(500000); // Sleep 500 milliseconds
clock_gettime(CLOCK_MONOTONIC, &end);
printf("Elapsed time: %lf \n", (((end.tv_sec - start.tv_sec) / 1.0e3) + ((end.tv_nsec - start.tv_nsec) / 1.0e6)));
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在printf函数I中减去秒并除以1000以将结果转换为毫秒,然后我减去纳秒并除以1000000以将结果转换为毫秒,最后添加两个结果.
我认为这是正确的方法,但由于某种原因,输出包含负值:
Elapsed time: 500.117421
Elapsed time: -499.882167
Elapsed time: 500.193631
Elapsed time: -499.884990
Elapsed time: 500.115007
Elapsed time: -499.877328
Elapsed time: 500.127219
Elapsed time: -499.875301
Elapsed …Run Code Online (Sandbox Code Playgroud)