Форум программистов, компьютерный форум, киберфорум
С под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
2 / 5 / 0
Регистрация: 11.07.2014
Сообщений: 42
1

Ошибка сегментирования когда клиент уже отправил данные на сервер

11.07.2014, 11:25. Просмотров 1161. Ответов 5
Метки нет (Все метки)

Добрый день, есть два куска кода, не могу понять почему у меня ошибка сегментирования когда клиент уже отправил данные на сервер.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
c = sizeof(struct sockaddr_in);
    while( (new_socket = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c)) )
    {
 
        puts("Connection accepted");
 
        pthread_t sniffer_thread;
        new_sock = malloc(1);
        *new_sock = new_socket;
         
        if( pthread_create( &sniffer_thread , NULL ,  connection_handler , (void*) new_sock) < 0)
        {
            perror("could not create thread");
            return 1;
        }
         
        puts("Handler assigned");
    }
C
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
void *connection_handler(void *socket_desc)
{
    //Get the socket descriptor
    int sock = *(int*)socket_desc;
    int read_size;
    char *message , client_message[2000];
 
    while( (read_size = recv(sock , client_message , 2000 , 0)) > 0 )
    {
        char *data = (char*)malloc(255 * sizeof(char));
        data = strstr(client_message,"GET ");
        data = data + 4;
        
        char *tmp = (char*)malloc(255 * sizeof(char));
        tmp = strstr(client_message," ");
        int size = tmp - data;
        
        char *buff = (char*)malloc(size * sizeof(char)+10);
        strncpy(buff,data,size);
        puts(buff);
 
    }
     
    if(read_size == 0)
    {
        puts("Client disconnected");
        fflush(stdout);
    }
    else if(read_size == -1)
    {
        perror("recv failed");
    }
 
    free(socket_desc);
     
    return 0;
}
суть задачи вывести в консоль url get запроса, который делает клиент

Добавлено через 19 минут
прошу прощения, почему-то редактировать нельзя. нашел код где падает, но не пойму. у меня size = -1
C
1
2
3
4
int size = tmp - data;
        
        char *buff = (char*)malloc(size * sizeof(char)+10);
        strncpy(buff,data,size);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.07.2014, 11:25
Ответы с готовыми решениями:

Клиент-сервер: ошибка сегментирования (стек памяти сброшен на диск)
Здравствуйте. Пишу небольшой клиент-сервер. По заданию клиент посылает на сервер число, а сервер...

Проблема: клиент оправляет данные, но когда они доходят сервер выключается
Написал программу клиент сервер, создал виртуальная машины, наладил сеть. Проблемам: клиент...

Как узнать отправил ли клиент данные или нет ?
Доброго времени суток! У кого нибудь есть исходники проверки отправил ли данные клиент или нет ?...

Когда запускаю сервер на одной машине, а клиент на другой, то выскакивает ошибка: error 10061
Привет всем, решил написать маленький чат для себя. Сделал две программы, одна сервер, другая...

5
415 / 289 / 93
Регистрация: 02.10.2008
Сообщений: 1,099
Записей в блоге: 1
11.07.2014, 11:41 2
Цитата Сообщение от evildoer Посмотреть сообщение
C
1
2
new_sock = malloc(1);
new_sock = new_socket;
WTF? С каких это пор sizeof(int) стал равен единице?
Цитата Сообщение от evildoer Посмотреть сообщение
C
1
2
3
4
char *message , client_message[2000];
while( (read_size = recv(sock , client_message , 2000 , 0)) > 0 )
...
data = strstr(client_message,"GET ");
А '\0' куда записать в client_message если придёт от клиента ровно 2000 байт? А что будет делать strstr() если не найдёт "GET ", а завершения ASCIIZ строки я не вижу.
0
2 / 5 / 0
Регистрация: 11.07.2014
Сообщений: 42
11.07.2014, 11:43  [ТС] 3
уже нашел ошибку, там
C
1
2
3
char *tmp = (char*)malloc(255 * sizeof(char));
        tmp = strstr(data," "); //тут data надо было указать
        int size = tmp - data;
А Get в любом случае будет, так как это запрос браузера.

Кстати да, хотел спросить, как узнать сколько мне придет во входящем потоке чтобы не писать 2000 и как это реализуется?
0
415 / 289 / 93
Регистрация: 02.10.2008
Сообщений: 1,099
Записей в блоге: 1
11.07.2014, 11:49 4
Советую почитать http://ru.wikipedia.org/wiki/%... 1%80%D0%B0 ибо таких переполнений в этих кусках кода чуть ли не в каждой строке.

Добавлено через 2 минуты
Цитата Сообщение от evildoer Посмотреть сообщение
C
1
2
new_sock = malloc(1);
* * * * *new_sock = new_socket;
В зависимости от архитектуры sizeof(int) будет или 2 или 4. Т.е.
C
1
*new_sock = new_socket;
затерёт или 1 или 3 байта памяти, следующих за new_sock . Пересмотрите весь код на предмет переполнения буфера.
1
2 / 5 / 0
Регистрация: 11.07.2014
Сообщений: 42
11.07.2014, 11:52  [ТС] 5
Спасибо, я только учусь. Так а как узнать сколько будет входящий буфер сокета клиента?
0
415 / 289 / 93
Регистрация: 02.10.2008
Сообщений: 1,099
Записей в блоге: 1
11.07.2014, 12:01 6
Цитата Сообщение от evildoer Посмотреть сообщение
read_size = recv
Так в read_size кол-во реально прочитанных байт или -1 если была ошибка.
Bash
1
man recv
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2014, 12:01

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

не работает полностью сервер то есть не выводит когда клиент подключился когда вышел и не отправляет строку
import socket sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) host = '192.168.0.26'...

Клиент-сервер. Клиент не принимает данные
Здравствуйте о светлейшие умы сего мира! Я работаю над одним проектом, а именно написание...

Когда будет выход из цикла? (Чат: клиент-сервер)
Пытаюсь разобраться в примере кода по созданию сервера для чата: Соединились с новым клиентом....

Как сделать, чтоб клиент не вылетал, когда сервер недоступен?
Доброе время суток! У меня есть клиент и сервер, общающиеся по WCF. Клиент забирает с сервера...

Издает два коротких звука, когда включаю самодельные сервер и клиент
Прив, у меня такая беда, когда врубаю свой недосвервер, который принимает инфу от клиента и...

Добавление НОВЫХ данных в БД Access, когда она уже имеет в себе данные
Добрый вечер, знатоки. В университете проходим базы данных в делфи. У меня есть уже готовая БД в...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.