问题
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