Почему я получаю EACCES после вызова привязки сокетов в NASM linux x64

Мой код ниже. Я могу получить fd=3 в sys_socket, но не могу пройти через sys_bind из-за errno=EACCES. Я не знаю почему, так как я проверил регистры и данные памяти в my_sa. Не могли бы вы дать мне несколько советов? Большое спасибо.

        global  _start

struc sockaddr_in
    .sin_family resw 1
    .sin_port resw 1
    .sin_addr resd 1
    .sin_zero resb 8
endstruc

; Convert numbers (constants!) to network byte order
%define htonl(x) ((x & 0xFF000000) >> 24) | ((x & 0x00FF0000) >> 8) | ((x & 0x0000FF00) << 8) | ((x & 0x000000FF) << 24)
%define htons(x) ((x >> 8) & 0xFF) | ((x & 0xFF) << 8)

AF_INET     equ 2
SOCK_STREAM equ 1
INADDR_ANY  equ 0   ; /usr/include/linux/in.h

IP          equ htonl(INADDR_ANY)
PORT        equ htons(80)

STDIN       equ 0
STDOUT      equ 1

        section .data

        my_sa: istruc sockaddr_in
            at sockaddr_in.sin_family, dw AF_INET
            at sockaddr_in.sin_port, dw PORT
            at sockaddr_in.sin_addr, dd INADDR_ANY
            at sockaddr_in.sin_zero, dd 0, 0   ;  for struct sockaddr
        iend

        section .text
_start:
        mov     rax, 41                 ; system call sys_socket
        mov     rdi, AF_INET            ; AF_INET
        mov     rsi, SOCK_STREAM        ; SOCK_STREAM
        xor     rdx, rdx                ; INADDR_ANY=0
        syscall                         ; rax contains sockfd

        mov     rdi, rax                ; sockfd
        mov     rax, 49                 ; system call sys_bind
        mov     rsi, my_sa              ; address of struct sockaddr my_sa
        mov     rdx, sockaddr_in_size   ; sizeof(my_sa)
        syscall                         ; on success, rax is 0

0 ответов

Другие вопросы по тегам