UNIX domain datagram - “Invalid argument” on sendto

孤人 提交于 2020-05-17 05:59:07

问题


I am constructing UNIX domain datagram sockets to pass messages from one thread to another thread in the same program. The socket code is written in C and it's called from NASM.

Sendto returns (through perror) "socket: Invalid argument."

Here is the code for 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;
}

Here is how I call client_send from 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

The server socket is constructed like this:

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;
}

At the point of the call to sendto, the two endpoints are connected because socket_server_fd (file descriptor) is 4 and socket_client_fd is 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

The socket server is initialized like this:

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

Debugging with gdb at the point of the call, perror returns "socket: Invalid argument."

The message being passed is a qword array of 90 elements (720 bytes).

I can't spot the invalid argument in the client_send code above. Thanks for any help with this.

来源:https://stackoverflow.com/questions/61580229/unix-domain-datagram-invalid-argument-on-sendto

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!