Я начинаю на C++. Раньше я писал код в интерпретированных языках.Ошибка сегментации при общении на сокетах: Неверная запись размера 1
Я пишу код клиентского сервера на C++ с помощью программирования сокетов для выполнения некоторых операций с файлами. Клиент отправляет имя файла на сервер, и сервер открывает этот файл для выполнения операций.
Следующий фрагмент кода показывает порядок приема файла от клиента:
char buf[512];
char *name;
connectionID = accept(socketID, (sockaddr *) NULL, NULL);
cout << "Connection created" << endl;
int bytes = recv(connectionID, buf, sizeof(buf), 0);
buf[bytes] = '\0';
strcpy(name, buf);
cout << name << endl;
Этот код работает в случайном порядке. Я поместил его в другой файл, и он внезапно прекратил работать. Когда я пытаюсь использовать GDB, чтобы увидеть, где происходит ошибка сегментации, GDB показывает либо пустые строки, либо любую строку в коде, кажется неуместным.
>(gdb) where
>#0 0xb74a8979 in ??()
>#1 0x00000000 in ??()
>(gdb) up
>#1 0x00000000 in ??()
>(gdb) down
>#0 0xb74a8979 in ??()
>(gdb) down
>Bottom (innermost) frame selected; you cannot go down.
Однако вывод valgrind показывает некоторую информацию, но я все еще не могу понять, что здесь не так.
>==11855== Invalid write of size 1
>==11855== at 0x402C6C3: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86- linux.so)
>==11855== by 0x804D38A: main (server.cpp:100)
>==11855== Address 0x0 is not stack'd, malloc'd or (recently) free'd
>==11855==
>==11855==
>==11855== Process terminating with default action of signal 11 (SIGSEGV)
>==11855== Access not within mapped region at address 0x0
>==11855== at 0x402C6C3: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-l
Valgrind также показал
>==11871== Use of uninitialised value of size 4
>==11871== at 0x402C6C3: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86- linux.so)
>==11871== by 0x8048DF8: main (in /media/sf_programs/project/a.out)
Однако эта ошибка не возникает, если я инициализировать указатель имен в NULL. Затем возникает только неправильная запись размера.
Я видел сообщения о недопустимой записи размера, в тех случаях, когда при указании обращаются за пределами диапазона, возникают сбои seg. Но я не могу понять, где он находится вне диапазона.
У вас есть полезная информация? Кажется, что программа вылетает при получении ввода строки и сохраняет ее от клиента.
'strcpy (name, buf);' Спросите себя, что означает 'name', когда эта строка кода выполняется? И да, это происходит *, когда вы инициализируете его до NULL. Без присвоения * допустимого * записываемого адреса для сегмента памяти соответствующего размера для получения этой копии в качестве значения в 'name', это неопределенное поведение. – WhozCraig