UNIX доменная датаграмма - «Неверный аргумент» на sendto - PullRequest
0 голосов
/ 03 мая 2020

Я создаю UNIX сокетов датаграмм домена для передачи сообщений из одного потока в другой поток в той же программе. Код сокета написан на C и вызывается из NASM.

Sendto возвращает (через perror) "socket: неверный аргумент".

Вот код для sendto:

ssize_t client_send(int64_t sfd, const void * buf, int64_t msgLen, const void * svaddr)
{
    ssize_t result = sendto(sfd, buf, msgLen, 0, (struct sockaddr *) &svaddr, sizeof(struct sockaddr_un));
     perror("socket");
    if (result != msgLen)
        return -1;

    return result;
}

Вот как я вызываю client_send из NASM:

mov rdi,[socket_client_fd]      ; int64_t sfd
lea rsi,[socket_buffer]     ; const void * buf
mov rdx,720             ; msgLen
lea rcx,[socket_server_addr]    ; (struct sockaddr *) &svaddr
mov r8,r15
call client_send wrt ..plt

Сокет сервера построен так:

int64_t * create_socket_server()
{
    struct sockaddr_un svaddr, claddr;
    int sfd, j;
    ssize_t numBytes;
    socklen_t len;
    char buf[BUF_SIZE];
    static int64_t retvals[2];

    retvals[0] = 0;
    retvals[1] = 0;

    sfd = socket(AF_UNIX, SOCK_DGRAM, 0); /* Create server socket */

    if (sfd == -1)
         return retvals;

    /* Construct well-known address and bind server socket to it */

    if (remove(SV_SOCK_PATH) == -1 && errno != ENOENT)
           return retvals;

    memset(&svaddr, 0, sizeof(struct sockaddr_un));
    svaddr.sun_family = AF_UNIX;
    strncpy(svaddr.sun_path, SV_SOCK_PATH, sizeof(svaddr.sun_path) - 1);

    if (bind(sfd, (struct sockaddr *) &svaddr, sizeof(struct sockaddr_un)) == -1)
           return retvals;

    retvals[0] = sfd;
    retvals[1] = (int64_t)&svaddr;

     return retvals;
}

В точке вызова sendto две конечные точки соединены, потому что socket_server_fd (дескриптор файла) равен 4, а socket_client_fd равен 5.

; Open the Socket Server
call create_socket_server wrt ..plt
mov rdi,rax
mov rax,[rdi]
mov [socket_server_fd],rax
mov rax,[rdi+8]
mov [socket_server_addr],rax

Сервер сокетов инициализируется следующим образом :

Open_Socket_Server:
call create_socket_server wrt ..plt
mov rdi,rax
mov rax,[rdi]
mov [socket_server_fd],rax
mov [rdi+8],rax
mov [socket_server_addr],rax

Отладка с помощью gdb в точке вызова, perror возвращает «socket: неверный аргумент».

Передаваемое сообщение представляет собой массив qword из 90 элементов (720 байт).

Я не могу определить неверный аргумент в приведенном выше коде client_send. Спасибо за любую помощь с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...