Форум программистов, компьютерный форум, киберфорум
Assembler: Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 19.08.2014
Сообщений: 59

Вызовы sento и recvfrom в получении udp пакетов

13.02.2017, 12:22. Показов 1569. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Код отвечающий за системные вызовы sento и recvfrom
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
%define FAST_MESSAGE_MAX_SIZE       2048
%define SYS_SENDTO  44
%define SYS_RECVFROM    45
...
sys_sendto: 
    mov r9, 8
    mov r8, sockaddr_in
    mov r10, 0
    mov rdx, [buffer]
    mov rsi, buffer
    mov rdi,[listen_socket]
    mov rax, SYS_RECVFROM
    syscall
    ret
sys_recvfrom:   
    mov r9, 16
    mov r8, sockaddr_in
    mov r10, 0
    mov rdx, FAST_MESSAGE_MAX_SIZE
    mov rsi, buffer
    mov rdi,[listen_socket]
    mov rax, SYS_RECVFROM
    syscall
    ret
...
section .data
sockaddr_in:    ;
        sin_family dw AF_INET            ; AF_INET
        sin_port dw LISTEN_PORT        ; port 60833
        sin_addr dd 0             ; 
section .bss
listen_socket:  resq 1
buffer: resb 4096
результатом выполнения mov rax, SYS_RECVFROM является -22(EINVAL/передан неверный аргумент), что именно может быть не правильно?

Добавлено через 10 минут
В последней строке ошибка - надо "ошибка -14, передан неверный адрес"

Добавлено через 21 час 56 минут
После поиска и экспериментов дошло до следующего кода
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
sys_recvfrom:   
    mov r9, 16
    mov r8, from
    mov r10, 0
    mov rdx, FAST_RECV_BUFFER_SIZE
    mov rsi, buffer
    mov rdi,[listen_socket]
    mov rax, SYS_RECVFROM
    syscall
    ret
...
.bss
struc source
    .family:    resb 2
    .port:      resb 2
    .addr:  resb 4
endstruc
 
from:       istruc source
    at source.family,           dw 0
    at source.port,     dw 0
    at source.addr,     dd 0
iend
то есть было выделено место под структуру from по образу и подобию sockaddr_in, только пустую. Код ошибки изменился на -14 (EFAULT), то есть - "Указатель на приемный буфер указывает вне адресного пространства процесса". Какие действия можно предпринять для исправления этой ситуации?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.02.2017, 12:22
Ответы с готовыми решениями:

UDP Connect не снимает блокировку recvfrom
Как написано у товарища Стивенса, при использовании присоединенного сокета возвращаются асинхронные...

Таймер ожидания для recvfrom (сокеты, UDP)
Как установить таймер ожидания для функции recvfrom?

UDP клиент на сокетах - порты, с которых принимает recvfrom
Здравствуйте! Есть вопрос по UDP, постараюсь подробно сформулировать. Ситуация 1: На хосте А...

2
1 / 1 / 0
Регистрация: 19.08.2014
Сообщений: 59
15.02.2017, 13:54  [ТС]
После изменений в коде, удалось добиться ошибки 11 при вызове RECVFROM, (Сокет помечен как неблокирующий, а операция приема данных могла заблокировать его, или же был установлен тайм-аут на прием данных, и этот тайм-аут закончился, а данные так и не были приняты).
При запуске в tcpdump получаем
Assembler
1
2
3
4
5
tcpdump -i ppp1 -vv
20:16:16.953019 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto IGMP (2), length 44, options (RA))
    benzin > igmp.mcast.net: igmp v3 report, 1 group record(s) [gaddr 239.192.70.11 block { 0.0.0.0 }]
20:16:17.285030 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto IGMP (2), length 44, options (RA))
    benzin > igmp.mcast.net: igmp v3 report, 1 group record(s) [gaddr 239.192.70.11 block { 0.0.0.0 }]
если параллельно запустить аналогичный сервис в другой программе получаем
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
10.50.129.90.34657 > 239.192.70.11.40011: [udp sum ok] UDP, length 240
20:28:53.590414 IP (tos 0x0, ttl 30, id 24045, offset 0, flags [DF], proto UDP (17), length 268)
    10.50.129.90.34657 > 239.192.70.11.40011: [udp sum ok] UDP, length 240
20:28:53.605010 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto IGMP (2), length 44, options (RA))
    benzin > igmp.mcast.net: igmp v3 report, 1 group record(s) [gaddr 239.192.70.11 block { 10.50.129.90 }]
20:28:53.607901 IP (tos 0x0, ttl 30, id 24046, offset 0, flags [DF], proto UDP (17), length 268)
    10.50.129.90.34657 > 239.192.70.11.40011: [udp sum ok] UDP, length 240
20:28:53.625335 IP (tos 0x0, ttl 30, id 24047, offset 0, flags [DF], proto UDP (17), length 262)
    10.50.129.90.34657 > 239.192.70.11.40011: [udp sum ok] UDP, length 234
20:28:53.633021 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto IGMP (2), length 44, options (RA))
    benzin > igmp.mcast.net: igmp v3 report, 1 group record(s) [gaddr 239.192.70.11 block { 10.50.129.90 }]
20:28:53.642641 IP (tos 0x0, ttl 30, id 24048, offset 0, flags [DF], proto UDP (17), length 268)
может у кого есть мысли в каком направлении двигаться?

Добавлено через 19 часов 34 минуты
Можно ли считать что код правильный если в отладочном режиме получаю 0 после выполнения системного вызова?
0
1 / 1 / 0
Регистрация: 19.08.2014
Сообщений: 59
20.02.2017, 10:57  [ТС]
Код

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
global _start
 
struc sockaddr_in
    .sin_family resw 1
    .sin_port resw 1
    .sin_addr resd 1
    .sin_zero resb 8
endstruc
 
struc img
    .source_ip  resb 4
    .int_ip resb 4
    .group_ip   resb 4
endstruc
 
section .bss
 
    listen_socket:  resq 1
    buffer: resb 2048
 
section .data
 
pop_sa istruc sockaddr_in
        at sockaddr_in.sin_family, dw 2           ; AF_INET
        at sockaddr_in.sin_port, dw 0x4b9c        ; port 40011
        at sockaddr_in.sin_addr, dd 0xb46c0ef             ; INADDR_ANY
        at sockaddr_in.sin_zero, dd 0, 0
iend
sockaddr_in_len     equ $ - pop_sa
 
pop_mc  istruc img  ;
    at img.source_ip,   dd 0xb46c0ef ;
    at img.int_ip,      dd 0             ; INADDR_ANY
    at img.group_ip,    dd 0x5a81320a ;
iend
img_len equ $ - pop_mc
from_ip:    dw 0    
from_ip_len:    db 16
 
section .text
 
_start:
 
    mov rdi, 2      ;AF_INET
    mov rsi, 2      ;SOCK_DGRAM
    mov rdx, 0      ;IPPROTO_UDP
    mov rax, 41
    syscall         ;sys_create_udp_socket
    mov[listen_socket], rax
 
    mov r8, 4        
    mov r10, 1   
    bswap eax
    mov rdx, 2  ;SO_REUSEADDR
    mov rsi, 1  ;SOL_SOCKET
    mov rdi,[listen_socket]
    mov rax, 54
    syscall         ;sys_setsockopt
    
    mov rdx, sockaddr_in_len
    mov rsi, pop_sa
    mov rdi,[listen_socket]
    mov rax, 49
    syscall         ;sys_bind
 
    mov r8, img_len
    mov r10, pop_mc
    mov rdx, 39     ;IP_ADD_SOURCE_MEMBERSHIP
    mov rsi, 0  ;IPPROTO_UDP
    mov rdi,[listen_socket]
    mov rax, 54
    syscall         ;sys_setsockopt
 
    mov r9, [from_ip_len]   ;
    mov r8, [from_ip]
    mov r10, 0
    mov rdx, 2047
    mov rsi, buffer
    mov rdi,[listen_socket]
    mov rax, 45
    syscall         ;sys_recvfrom
 
    mov rdi, 0
    mov rax, 60
    syscall         ;sys_exit
после нескольких секунд работы перестает получать данные. Что добавить, изменить чтобы работа была стабильной?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.02.2017, 10:57
Помогаю со студенческими работами здесь

udp socket косяки при получении данных
всем привет. использую udpsocket UdpSocket1.Sendln('hello',''); //посылаем...

Сниффер UDP пакетов
Здравствуйте, нужно написать сниффер, который будет перехватывать только UDP пакеты Начал искать...

Потери UDP пакетов
Всем здравствуйте...Столкнулся со следующей проблемой. Попытался передать довольно большой файл по...

Перехват UDP пакетов
Здравствуйте ! Есть два комп'ютера связанные по сети. Программа на первом отправляет некие...

Прием UDP пакетов
Здравствуйте. Сразу скажу, никогда не имел дело с сокетами, тем более с UDP. Сервер у меня на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru