小编use*_*972的帖子

将struct转换为数组?

我目前正在学习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;

任何人都可以详细解释这个吗?

c arrays struct pointers

6
推荐指数
1
解决办法
4938
查看次数

UDP套接字的源和目标端口?

我正在通过编写一个将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)

c sockets linux networking udp

6
推荐指数
1
解决办法
2963
查看次数

时间测量中的负值?

我正在尝试以毫秒为单位测量时间:

#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)

c linux time

0
推荐指数
1
解决办法
525
查看次数

标签 统计

c ×3

linux ×2

arrays ×1

networking ×1

pointers ×1

sockets ×1

struct ×1

time ×1

udp ×1