Неблокирующий TCP-сокет C++, вызывающий пропуск std::cinC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Неблокирующий TCP-сокет C++, вызывающий пропуск std::cin

Сообщение 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


Подробнее здесь: https://stackoverflow.com/questions/791 ... ipped-over
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»