2013-11-10 2 views
0

Я начинаю на 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. Но я не могу понять, где он находится вне диапазона.

У вас есть полезная информация? Кажется, что программа вылетает при получении ввода строки и сохраняет ее от клиента.

+1

'strcpy (name, buf);' Спросите себя, что означает 'name', когда эта строка кода выполняется? И да, это происходит *, когда вы инициализируете его до NULL. Без присвоения * допустимого * записываемого адреса для сегмента памяти соответствующего размера для получения этой копии в качестве значения в 'name', это неопределенное поведение. – WhozCraig

ответ

1
char *name; 

Вы сделали указатель, отлично, но вы забыли указать на что-либо. Как, например, буфер памяти.

Не одержимы конкретными valgrind диагностика здесь; они все на одной теме: вы пытаетесь использовать полностью случайную память, которая не принадлежит вам.

Это правда, если вы инициализируете name до NULL или оставьте его неинициализированным или кормите его сливочным сыром. До тех пор, пока вы не присвоите ему место действительной памяти, которое у вас есть, вы также можете попеть Макарену на палубу Титантики, потому что этот корабль может немного поплавать для нескольких сцен (достаточно времени для какого-то драматического кино), но в в долгосрочной перспективе, он больше не поплывет!

+0

Большое спасибо. Я решил это с добавлением этой строки. char * входFileName = (char *) malloc (размерof (char) * 1024); –

Смежные вопросы