LINUX.ORG.RU

accept возвращает «Invalid argument»

 


0

2

Тут кода то. Но вот как обстоят дела. До accept всё выполняется без ошибок, это

socket
setsockopt
bind
listen
Я использовал «повторное использование кода», вот где, это действительно нужно. Собрал программу из нескольких маленьких программ. Так вот, eip доходит до функции accept, выдаёт ошибку -22, что означает «Invalid Argument». Вот сама функция
        mov eax, 364 ; accept
        mov ebx, [socket] ; socket
        xor ecx, ecx ; struct sockaddr
        xor edx, edx ; sizeof ( struct sockaddr )
        int 0x80
        or eax, eax
        js close
В [socket] я проверял, тот что нужно, там всё правильно, да и он не изменится, и с ним всё нормально.

Ответ на: комментарий от i-rinat

Артикуляция выглядит как указание направления на юг!

vvn_black ★★★★★ ()

Работает ли эквивалентная программа на с?

anonymous ()
Ответ на: комментарий от vzzo
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(8081), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(3, 0)                            = 0
accept4(3, NULL, NULL, 0x80496f2 /* SOCK_??? */) = -1 EINVAL (Invalid argument)
close(3)                                = 0
exit(0) 

Странно, я раньше accept использовал и всё нормально было. Но щас я точно знаю, что это accept4 используется, значил нехватает параметров. Тогда буду использовать syscall.

u0atgKIRznY5 ()
Ответ на: комментарий от anonymous

анонимусы его подчиняют криминальным гипнозом

SZT ★★★★★ ()

xor edx, edx ; sizeof ( struct sockaddr )

Исключающее «ИЛИ» значения с самим собой всегда дает в ответе нуль.

Ты явно не понимаешь, что делаешь.

Deleted ()
Ответ на: комментарий от Deleted

Это норм. Третьим параметром в accept/accept4 передаётся указатель на переменную типа socklen_t. Если адрес клиента не нужен, вторым и третьим параметрами можно передавать NULL.

Комментарий просто кривой.

i-rinat ★★★★★ ()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Комментарий просто кривой.

Так я о том же. Больше похоже на бездумную компиляцию вывода objdump.

Deleted ()
Ответ на: комментарий от Deleted

Ты явно не понимаешь, что делаешь.

Что? Мне нужно передать ноль как аргумент, вот я его и обнуляю. Видимо вы незнаете что в accept можно передать нули и вот

The argument addr is a pointer to a sockaddr structure. This structure is filled in with the address of the peer socket, as known to the communications layer. The exact format of the address returned addr is determined by the socket's address fam‐ ily (see socket(2) and the respective protocol man pages). When addr is NULL, nothing is filled in; in this case, addrlen is not used, and should also be NULL.

Особенно прошу заметить

When addr is NULL, nothing is filled in; in this case, addrlen is not used, and should also be NULL.

u0atgKIRznY5 ()
Ответ на: комментарий от Silerus

что то не заметно

Что незаметно? Что, можно лучше написать? Так ты напиши здесь или если незнаешь, то как ты заметить можешь?

u0atgKIRznY5 ()

Передайте ему, что в 32-битном режиме сабжевой архитектуры нет системного вызова accept и вся работа с сокетами идет через системный вызов socketcall.

anonymous ()
Ответ на: комментарий от anonymous

Хотя все не так однозначно:

On x86-32, socketcall() was historically the only entry point for the sockets API. However, starting in Linux 4.3, direct system calls are provided on x86-32 for the sockets API.

http://man7.org/linux/man-pages/man2/socketcall.2.html

Короче, пусть сам разбирается. Из него ничего путного не получится, если он не научится сам решать свои проблемы.

anonymous ()
Ответ на: комментарий от anonymous

а зачем учиться, найдется хоть один кто начнет помогать - мир не без добрых людей.

Silerus ★★★ ()
Ответ на: комментарий от Silerus

Ну и чем лучше? Если не считать что это клиентское приложение? Ты мне так скажи, что не так? Я подобное могу написать, но только с прерываниями. От меня то ты что хочешь? Что там написано лучше?

u0atgKIRznY5 ()
Ответ на: комментарий от thesame

тут анон уже написал почему не работает

А что его слушать, хотя я и незнаю что он написал. Вообще то мой первый комментарий уже дал понять, что я справился с заданием. Разве это не заметно?

u0atgKIRznY5 ()
Ответ на: комментарий от u0atgKIRznY5

Хоть ты меня тоже не слушаешь, я все ж выскажусь, для остальных

Вот ты там решил кого-то игнорить из-за своей глупости, тем, что ты кого-то не слушаешь ты себе только создаешь проблемы, потому как вряд ли кто-то будет передавать что-то, что сказано кем-то, кого ты там решил игнорировать. И более того, вполне возможна такая ситуация, что кто-то, кого ты там решил из-за своей глупости игнорить, дал полный и исчерпывающий ответ на твой вопрос, и больше никто в твой тред ничего не отвечает, потому что ответ на вопрос уже дан, а про то, что ты этого кого-то решил игнорить никто просто не в курсе. Так что ты своими игнорами показываешь только свою глупость и ограниченность, и создаешь проблемы сам себе

У меня все.

И да, можете ему это передать (из числа тех, кого он не игнорит). Хотя он похоже непробиваем

SZT ★★★★★ ()
Последнее исправление: SZT (всего исправлений: 2)
Ответ на: комментарий от SZT

Вообще, предлагаю этого товарища дружно игнорить всем лором и не отвечать в его топики, пока не поумнеет, не перестанет кого попало игнорить и не перестанет игнорировать мудрые советы выучить сначала Си по книге K&R вместо написания хреноты на асме под 32-битные x86

SZT ★★★★★ ()
Последнее исправление: SZT (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.