为什么在NASM linux x64中调用套接字绑定后会得到EACCES
我的代码如下。我可以在sys\u套接字中获得fd=3,但由于errno=EACCES,无法通过sys\u绑定。我不知道为什么,因为我已经在我的办公室检查了寄存器和内存数据。你能给我一些建议吗?非常感谢为什么在NASM linux x64中调用套接字绑定后会得到EACCES,linux,sockets,bind,nasm,system-calls,Linux,Sockets,Bind,Nasm,System Calls,我的代码如下。我可以在sys\u套接字中获得fd=3,但由于errno=EACCES,无法通过sys\u绑定。我不知道为什么,因为我已经在我的办公室检查了寄存器和内存数据。你能给我一些建议吗?非常感谢 global _start struc sockaddr_in .sin_family resw 1 .sin_port resw 1 .sin_addr resd 1 .sin_zero resb 8 endstruc ; Convert n
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
global\u启动
struc sockaddr_in
.sin_家庭报告1
.sin_port resw 1
.sinu addr resd 1
.sinu zero resb 8
端部结构
; 将数字(常数!)转换为网络字节顺序
%定义htonl(x)((x&0xFF000000)>>24)|((x&0x00FF0000)>>8)|((x&0x0000FF00)8)&0xFF)|((x&0xFF)你是以root身份运行程序吗?只有root可以绑定1024以下的端口。哦,我明白了。谢谢!解决了!你是以root身份运行程序吗?只有root可以绑定1024以下的端口。哦,我明白了。谢谢!解决了!