Фрагменты кода и журналы отладчика
Выполнение не затрагивает std::cin.getline для записи пользовательского текста в буфер.
icpx -O0 -g -std=c++20 -march=native -mtune=native -fomit-frame-pointer -mavx2 -mfma -ffast-math -ltbb -lm -lpthread non_blockingSocket.cpp -o ./bin/non_sockets_exe
Компиляция с указанным выше
// Non-Blocking Socket
int fcn_setup[3] {
fcntl(socket_err_array[0],F_GETFL),0x0,0x0
};
bool fcnt_flags_success {(F_SETFD == fcn_setup[0])};
fcn_setup[1] = fcntl(socket_err_array[0],F_SETFL,fcn_setup[0]|O_NONBLOCK);
где 2 == F_SETFL ("/* Установить флаги дескриптора файла. /)
и 0 == F_DUPFD (" / Дублировать дескриптор файла. */
(lldb) frame variable fcn_setup
(int[3]) fcn_setup = ([0] = 2, [1] = 0, [2] = 0)
socket_err_array[3] = accept(socket_err_array[0],(sockaddr*)&connected_socket,(socklen_t*)&lengthofObject);
(lldb) frame variable socket_err_array[3]
(int) socket_err_array[3] = 5
Переход к правильной ветке ниже
printf("Connection Received\n");
memset((void*)rec_region,0x00,0x100);
memset((void*)write_region,0x00,0x100);
socket_err_array[4] = (int)recv(socket_err_array[3],(void*)rec_region,0x100,MSG_DONTWAIT);
__asm__ __volatile__("nop");
printf(" Message Received (%d - %d) : %s \n", socket_err_array[4],socket_err_array[5],rec_region);
std::cin.getline(write_region,0x100); /* ### THIS LINE ### */
socket_err_array[5] = (int)send(socket_err_array[3],(const void*)write_region,0x100,0x0);
__asm__ __volatile__("nop");
LLDB: при входе в код выполнение пропускает вызов std::cin.getline, есть объяснение, почему он это делает?
(lldb) x/i $rip --count 10
-> 0x404338: e8 73 ed ff ff call callq 0x4030b0 ; symbol stub for: std::istream::getline(char*, long)
0x40433d: eb 00 jump jmp 0x40433f ; at non_blockingSocket.cpp:177:49
0x40433f: 8b bc 24 ac 01 00 00 other movl 0x1ac(%rsp), %edi
0x404346: 48 8b b4 24 80 01 00 00 other movq 0x180(%rsp), %rsi
0x40434e: ba 00 01 00 00 other movl $0x100, %edx ; imm = 0x100
0x404353: 31 c9 other xorl %ecx, %ecx
0x404355: e8 f6 ed ff ff call callq 0x403150 ; symbol stub for: send
0x40435a: 48 89 44 24 10 other movq %rax, 0x10(%rsp)
0x40435f: eb 00 jump jmp 0x404361 ; at non_blockingSocket.cpp
0x404361: 48 8b 44 24 10 other movq 0x10(%rsp), %rax
(lldb) si
Process 184829 stopped
* thread #1, name = 'non_sockets_exe', stop reason = instruction step into
frame #0: 0x00000000004030b0 non_sockets_exe`std::istream::getline(char*, long)
non_sockets_exe`std::istream::getline:
-> 0x4030b0 : jmpq *0x8f8a(%rip) ; _GLOBAL_OFFSET_TABLE_ + 88
0x4030b6 : pushq $0x8
0x4030bb : jmp 0x403020 ; ___lldb_unnamed_symbol447
non_sockets_exe`accept:
0x4030c0 : jmpq *0x8f82(%rip) ; _GLOBAL_OFFSET_TABLE_ + 96
Пропускает вызов std::cin.getline и переходит к следующей инструкции
(lldb) x/i $rip --count 10
-> 0x40433d: eb 00 jump jmp 0x40433f ; at non_blockingSocket.cpp:177:49
0x40433f: 8b bc 24 ac 01 00 00 other movl 0x1ac(%rsp), %edi
0x404346: 48 8b b4 24 80 01 00 00 other movq 0x180(%rsp), %rsi
0x40434e: ba 00 01 00 00 other movl $0x100, %edx ; imm = 0x100
0x404353: 31 c9 other xorl %ecx, %ecx
0x404355: e8 f6 ed ff ff call callq 0x403150 ; symbol stub for: send
0x40435a: 48 89 44 24 10 other movq %rax, 0x10(%rsp)
0x40435f: eb 00 jump jmp 0x404361 ; at non_blockingSocket.cpp
0x404361: 48 8b 44 24 10 other movq 0x10(%rsp), %rax
0x404366: 89 84 24 b4 01 00 00 other movl %eax, 0x1b4(%rsp)
(lldb) ni
Подробнее здесь: https://stackoverflow.com/questions/791 ... ipped-over
Неблокирующий TCP-сокет C++, вызывающий пропуск std::cin ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1731830407
Anonymous
Фрагменты кода и журналы отладчика
Выполнение не затрагивает std::cin.getline для записи пользовательского текста в буфер.
icpx -O0 -g -std=c++20 -march=native -mtune=native -fomit-frame-pointer -mavx2 -mfma -ffast-math -ltbb -lm -lpthread non_blockingSocket.cpp -o ./bin/non_sockets_exe
Компиляция с указанным выше
// Non-Blocking Socket
int fcn_setup[3] {
fcntl(socket_err_array[0],F_GETFL),0x0,0x0
};
bool fcnt_flags_success {(F_SETFD == fcn_setup[0])};
fcn_setup[1] = fcntl(socket_err_array[0],F_SETFL,fcn_setup[0]|O_NONBLOCK);
где 2 == F_SETFL ("/* Установить флаги дескриптора файла. /)
и 0 == F_DUPFD (" / Дублировать дескриптор файла. */
(lldb) frame variable fcn_setup
(int[3]) fcn_setup = ([0] = 2, [1] = 0, [2] = 0)
socket_err_array[3] = accept(socket_err_array[0],(sockaddr*)&connected_socket,(socklen_t*)&lengthofObject);
(lldb) frame variable socket_err_array[3]
(int) socket_err_array[3] = 5
Переход к правильной ветке ниже
printf("Connection Received\n");
memset((void*)rec_region,0x00,0x100);
memset((void*)write_region,0x00,0x100);
socket_err_array[4] = (int)recv(socket_err_array[3],(void*)rec_region,0x100,MSG_DONTWAIT);
__asm__ __volatile__("nop");
printf(" Message Received (%d - %d) : %s \n", socket_err_array[4],socket_err_array[5],rec_region);
std::cin.getline(write_region,0x100); /* ### THIS LINE ### */
socket_err_array[5] = (int)send(socket_err_array[3],(const void*)write_region,0x100,0x0);
__asm__ __volatile__("nop");
LLDB: при входе в код выполнение пропускает вызов std::cin.getline, есть объяснение, почему он это делает?
(lldb) x/i $rip --count 10
-> 0x404338: e8 73 ed ff ff call callq 0x4030b0 ; symbol stub for: std::istream::getline(char*, long)
0x40433d: eb 00 jump jmp 0x40433f ; at non_blockingSocket.cpp:177:49
0x40433f: 8b bc 24 ac 01 00 00 other movl 0x1ac(%rsp), %edi
0x404346: 48 8b b4 24 80 01 00 00 other movq 0x180(%rsp), %rsi
0x40434e: ba 00 01 00 00 other movl $0x100, %edx ; imm = 0x100
0x404353: 31 c9 other xorl %ecx, %ecx
0x404355: e8 f6 ed ff ff call callq 0x403150 ; symbol stub for: send
0x40435a: 48 89 44 24 10 other movq %rax, 0x10(%rsp)
0x40435f: eb 00 jump jmp 0x404361 ; at non_blockingSocket.cpp
0x404361: 48 8b 44 24 10 other movq 0x10(%rsp), %rax
(lldb) si
Process 184829 stopped
* thread #1, name = 'non_sockets_exe', stop reason = instruction step into
frame #0: 0x00000000004030b0 non_sockets_exe`std::istream::getline(char*, long)
non_sockets_exe`std::istream::getline:
-> 0x4030b0 : jmpq *0x8f8a(%rip) ; _GLOBAL_OFFSET_TABLE_ + 88
0x4030b6 : pushq $0x8
0x4030bb : jmp 0x403020 ; ___lldb_unnamed_symbol447
non_sockets_exe`accept:
0x4030c0 : jmpq *0x8f82(%rip) ; _GLOBAL_OFFSET_TABLE_ + 96
Пропускает вызов std::cin.getline и переходит к следующей инструкции
(lldb) x/i $rip --count 10
-> 0x40433d: eb 00 jump jmp 0x40433f ; at non_blockingSocket.cpp:177:49
0x40433f: 8b bc 24 ac 01 00 00 other movl 0x1ac(%rsp), %edi
0x404346: 48 8b b4 24 80 01 00 00 other movq 0x180(%rsp), %rsi
0x40434e: ba 00 01 00 00 other movl $0x100, %edx ; imm = 0x100
0x404353: 31 c9 other xorl %ecx, %ecx
0x404355: e8 f6 ed ff ff call callq 0x403150 ; symbol stub for: send
0x40435a: 48 89 44 24 10 other movq %rax, 0x10(%rsp)
0x40435f: eb 00 jump jmp 0x404361 ; at non_blockingSocket.cpp
0x404361: 48 8b 44 24 10 other movq 0x10(%rsp), %rax
0x404366: 89 84 24 b4 01 00 00 other movl %eax, 0x1b4(%rsp)
(lldb) ni
Подробнее здесь: [url]https://stackoverflow.com/questions/79196736/c-non-blocking-tcp-socket-causing-stdcin-to-get-skipped-over[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия