non blocking tcp client assembly

335 Views Asked by At

I am trying to create a tcp client for exchange data. The client should send the message first. If the message was correct, and the user has been property authorized, the system replies with the message 'Ask', confirming that the session has been successfully bound.

    ;; yasm -g dwarf2 -f elf64 -a x86 message.asm -o msg.o
    ;; ld -o msg msg.o
    segment .bss

listen_socket:  resq 1
read_fdset: resb 2  

    segment .data

packet istruc message
    at message.length_mes,          dw  0x2800
        at message.message_id,          dw  0x0100
        at message.scheme_id,           dw  0x0100
        at message.version,     dw  0x0100
        at message.timestamp,           dq  0
        at message.keeepaliveinterval,  dd  0xe8030000
        at message.credentials,         dq  0
        at message.ext,             dw  0
iend

pop_sa istruc sockaddr_in
        at sockaddr_in.sin_family,  dw 2             ; AF_INET
        at sockaddr_in.sin_port,    dw 0x2823        ; port 9000
        at sockaddr_in.sin_addr,    dd 0xf4e8d05b    ; 91.208.232.244
        at sockaddr_in.sin_zero,    dd 0, 0
iend
sockaddr_in_len     equ $ - pop_sa


timeval: ;struct
        tv_sec  dq 0
        tv_usec dq 0

timeout: ;struct
        to_sec  dq 0
        to_usec dq 5000

buffer      times 512 db 0x0

    segment .text
    global _start

_start:

struc message
    .length_mes             resw 1
    .message_id             resw 1
    .scheme_id              resw 1
    .version                resw 1
    .timestamp              resq 1
    .keeepaliveinterval         resd 1
    .credentials            resq 2
    .ext                    resw 1
endstruc

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

    mov rsi, timeval    ;   struct timespec *tp
    mov rdi, 0      ;   const clockid_t which_clock - CLOCK_REALTIME
    mov rax, 228        ;   SYS_CLOCK_GETTIME
    syscall
    mov r8, qword [tv_sec]
    mov r9, qword [tv_usec]
    imul r8, 1000000000
    sub r8, r9
    mov qword [packet + message.timestamp], r8

    mov rdi, 2      ; AF_INET
    mov rsi, 1      ; SOCK_STREAM
    mov rdx, 6      ; PROTO_TCP
    mov rax, 41     ; SYS_SOCKET
    syscall

    cmp rax, 0
    jl exit
    mov [listen_socket], rax

    xor rdx, rdx
    mov rsi, 3      ;F_GETFL
    mov rdi, [listen_socket]
    mov rax, 72     ;SYS_FCNTL
    syscall         ;return 2

    mov rdx, rax 
    or rdx, 2048
    mov rsi, 4      ;F_SETFL
    mov rdi, [listen_socket]
    mov rax, 72     ;SYS_FCNTL
    syscall         ; return 0

    mov rsi, pop_sa     ;
    mov rdx, sockaddr_in_len    ;
    mov rdi, [listen_socket]
    mov rax, 42     ; SYS_CONNECT
    syscall         ; return -115

    xor r9, r9
    xor r8, r8
    xor r10, r10
    mov rdx, 40
    mov rsi, packet
    mov rdi, [listen_socket]
    mov rax, 44     ; SYS_SENDTO
    syscall         ; return 40 - length message

rec:    

    mov r8, timeout
    mov r10, 0
    mov rdx, 0
    bts [read_fdset], rdi
    mov rsi, read_fdset
    inc rdi
    mov rax, 23     ;SYS_SELECT
    syscall         ; return 1

    xor r9, r9
    xor r8, r8
    xor r10, r10
    mov rdx, 512
    mov rsi, buffer
    mov rdi, [listen_socket]
    mov rax, 45     ; SYS_RECVFROM
    syscall         ; return 0

    cmp rax, 0
    jne exit

     jmp rec

exit:   
    mov rdi, 0
    mov rax, 60     ;   SYS_EXIT
    syscall

recvfrom return 0. What wrong in code?

0

There are 0 best solutions below