Я создаю 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. Спасибо за любую помощь с этим.