小编sta*_*kii的帖子

如何防止SIOCGIFADDR失败?

我想得到eth0的IP.这是我写的(也许有办法解决它?):

int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
check(sockfd > 0, "cannot create socket\n");

#define INTERFACE_NAME "eth0"
#define INTERFACE_NAME_LENGTH 4

char *opt = INTERFACE_NAME;
rc = setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, opt, INTERFACE_NAME_LENGTH);
check(rc == 0, "BINDTODEVICE failed");

struct ifreq req;
strncpy(req.ifr_name, INTERFACE_NAME, IFNAMSIZ);
rc = ioctl(sockfd, SIOCGIFADDR, (unsigned long)&req);
check(rc == 0, "SIOCGIFADDR failed");
server_ip = ((struct sockaddr_in*)&req.ifr_addr)->sin_addr.s_addr;
char str[50];
inet_ntop(AF_INET, &(server_ip), str, INET_ADDRSTRLEN);
debug("serverip: %s", str);

return sockfd;

error:
if (sockfd) close(sockfd);
exit(1); 
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

[错误](src/server/server.c:43:errno:无法分配请求的地址)SIOCGIFADDR失败

如果我使用与wlan0相同的方法,我会得到我期望看到的内容.

这是netstat输出:

netstat -tulpn:

Proto | …
Run Code Online (Sandbox Code Playgroud)

c sockets ioctl

5
推荐指数
1
解决办法
6748
查看次数

为什么GCC产生以下asm输出?

我不明白为什么要gcc -S -m32生成这些特定的代码行:

movl    %eax, 28(%esp)
movl    $desc, 4(%esp)
movl    28(%esp), %eax
movl    %eax, (%esp)
call    sort_gen_asm
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么%eax被推,然后弹出?为什么movl,而不是使用pushlpopl分别?它更快吗?是否有一些我还不知道的编码约定?我刚刚开始密切关注asm-output,所以我不太了解.

C代码:

void print_array(int *data, size_t sz);
void sort_gen_asm(array_t*, comparer_t);

int main(int argc, char *argv[]) {
    FILE *file;
    array_t *array;

    file = fopen("test", "rb");
    if (file == NULL) { 
        err(EXIT_FAILURE, NULL);
    }   

    array = array_get(file);
    sort_gen_asm(array, desc); 
    print_array(array->data, array->sz);

    array_destroy(array);
    fclose(file); 

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它给出了这个输出:

    .file   "main.c"
    .section    .rodata
.LC0:
    .string "rb"
.LC1: …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly gcc compilation

2
推荐指数
2
解决办法
451
查看次数

标签 统计

c ×2

assembly ×1

compilation ×1

gcc ×1

ioctl ×1

sockets ×1

x86 ×1