Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> многопоточный сервер, в чем у меня ошибка ? 
:(
    Опции темы
admsasha
Дата 26.4.2005, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



Код

int main(){
    volatile int waitp = 0;
    pthread_t  th;
    pthread_t  th2;
    int sockfd, newsockfd; 
    socklen_t clilen; 
    int n; 
    char line[1000]; 
    char tmpstring[200];
    pid_t   childpid;
    struct sockaddr_in servaddr, cliaddr; 
    /* Создаем TCP-сокет */
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
        perror(NULL);
        exit(1);
    }
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family= AF_INET;
    servaddr.sin_port= htons(9205);
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    /* Настраиваем адрес сокета */
    if(bind(sockfd, (struct sockaddr *) &servaddr,
    sizeof(servaddr)) < 0){
        perror(NULL);
        close(sockfd);
        exit(1);
    }
    if(listen(sockfd, 5) < 0){
        perror(NULL);
        close(sockfd);
        exit(1);
    }
    while(1){
        clilen = sizeof(cliaddr);
        newsockfd = accept(sockfd,(struct sockaddr *) &cliaddr, &clilen);
        if (newsockfd <0){perror(NULL);close(sockfd);exit(1);}
        printf("до ptheread \n");
        pthread_create(&th, NULL, &netsocket,(void *)&newsockfd);
        printf("после ptheread \n");
    }
    return 0;
}


void *netsocket(void *p){
    int sock = *(int *)p;
    int n;
    char tmpstring[1024];
    char line[1000]; /* Буфер для приема информации */
    free(p);
    printf("в netsocket\n ");
    while (n = read(sock, line, 100) > 0){
        printf("%s \n",line);
        strcpy(tmpstring,"344");
        write(sock, tmpstring,strlen(tmpstring));
    }
    printf("выход из newsocket \n");
    close(sock);
}


Код

Startдо ptheread - первый клиент
после ptheread - первый клиент
в netsocket - первый клиент
 Text1
Text1
до ptheread - второй клиент  и тут больше нечего не делает, т.е. зависает на потоке
выход из newsocket - первый клиент


собственно говоря, что у меня не так ?
PM MAIL WWW ICQ Jabber   Вверх
GrayCardinal
Дата 26.4.2005, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Цитата
(n = read(sock, line, 100) > 0)

Перед этой строчкой неплохо бы проверочку что данные вообще есть. Я бы не стал так писать.

Цитата
free(p);

ты всегда прикалываешься "освобождением сокетов" или только когда сильно обкуришься ? полпачки-пачка ? smile

нет, я конечно хорошо отношусь к bilbobagginz, но... руки видимо придется все ж таки поотрывать. smile Шутка.
и pthread на сколько я знаю для серваков не пользуют. пользуют fork ()

Сказать тебе что у тебя не так ? smile Шутка.



--------------------
PM MAIL WWW   Вверх
admsasha
Дата 26.4.2005, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



Цитата(GrayCardinal @ 26.4.2005, 23:04)
и pthread на сколько я знаю для серваков не пользуют. пользуют fork ()

ну определитесь что лучше )))
fork как то проще, но вот лучше ли он ?, он же занимает больше памяти и ресурсов, так что лучше pthread ....


PM MAIL WWW ICQ Jabber   Вверх
admsasha
Дата 26.4.2005, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



убрал free(p);
все работает,вроде как.. но как закрывать сокет ? close(p) - не правильно

как передать socket не через ссылку ?

Добавлено @ 18:04
Цитата(GrayCardinal @ 26.4.2005, 23:04)
Цитата
(n = read(sock, line, 100) > 0)

Перед этой строчкой неплохо бы проверочку что данные вообще есть. Я бы не стал так писать.


что и как именно ?

PM MAIL WWW ICQ Jabber   Вверх
dargaard
Дата 26.4.2005, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 450
Регистрация: 7.5.2004

Репутация: 1
Всего: 25



free(p); вообше убери

Цитата(admsasha @ 26.4.2005, 07:03)
все работает,вроде как.. но как закрывать сокет ? close(p) - не правильно

у тебя же уже есть close(sock); - оно и закроет.



--------------------
Ты должна сделать добро из зла 
потому что его больше не из чего
сделать. Р.П.Уоррен
PM MAIL WWW ICQ   Вверх
admsasha
Дата 27.4.2005, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



А почему процесы то создаются ??

Код

# ps ax|grep server
21699 pts/39   S+     0:00 ./server
31011 pts/39   S+     0:00 ./server
  413 pts/39   S+     0:00 ./server


PM MAIL WWW ICQ Jabber   Вверх
dargaard
Дата 27.4.2005, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 450
Регистрация: 7.5.2004

Репутация: 1
Всего: 25



1. На некоторых системах потоки выводятся в списке процессов.

2. попробуй после close(sock); поставить pthread_exit(0);


--------------------
Ты должна сделать добро из зла 
потому что его больше не из чего
сделать. Р.П.Уоррен
PM MAIL WWW ICQ   Вверх
admsasha
Дата 28.4.2005, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



Цитата(dargaard @ 27.4.2005, 17:49)
1. На некоторых системах потоки выводятся в списке процессов.


Так и pid`ы разные ?
у меня Mandrake Linux 10.1
PM MAIL WWW ICQ Jabber   Вверх
achmed
Дата 28.4.2005, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 12.4.2004

Репутация: нет
Всего: нет



В Linux потоки реализованы как процессы с разделяемым контекстом.

И еще раз man socket !!!
PM MAIL   Вверх
GrayCardinal
Дата 28.4.2005, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Цитата
ну определитесь что лучше

ты это кому ?

Цитата
все работает,вроде как..

smile smile
Добавлено @ 15:41
Цитата
fork как то проще, но вот лучше ли он ?, он же занимает больше памяти и ресурсов, так что лучше pthread ....

smile smile smile smile smile smile smile smile smile smile smile smile smile smile smile smile
Валялся по полу и долго плакал...
Ты представляешь себе сервак ? С, как минимум, 1Гб оперативки и Dual P3 ?

ЗЫ
у тебя даже в репуташке от bilbobagginz написано почему fork предпочтительней.

Это сообщение отредактировал(а) GrayCardinal - 28.4.2005, 15:48


--------------------
PM MAIL WWW   Вверх
bilbobagginz
Дата 29.4.2005, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



мдяаааа....
вам батенька ( admsasha ) в библиотеку НУЖНО, к источникам.
ваше чтиво:

1. A.Tanenbaum "Operating System concepts"
2. М.Bach "The design and implementation of UNIX Operating System"
3. чтобы понять что есть fork(), что есть thread, и какая разнница между
"многопроцессовостью" и "многопоточностью" нужно видимо установить man страницы, и почитать их. ещё можно по этой ссылке слазать: http://www.llnl.gov/computing/tutorials/wo...N.html#Overview



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
AndrK
Дата 13.7.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Цитата(GrayCardinal @ 28.4.2005,  15:38)
Цитата
ну определитесь что лучше

ты это кому ?

Цитата
все работает,вроде как.. 

smile  smile  
 Добавлено @ 15:41 
 
Цитата
fork как то проще, но вот лучше ли он ?, он же занимает больше памяти и ресурсов, так что лучше pthread ....

smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile 
Валялся по полу и долго плакал...
Ты представляешь себе сервак ? С, как минимум, 1Гб оперативки и Dual P3 ?

ЗЫ
у тебя даже в репуташке от bilbobagginz написано почему fork предпочтительней.

Ну если fork предпочтительнее, тогда обоснуй переход проекта appache на использование потоков...
Потоки менее нагружают систему... и хотя есть серваки которые ты описываешь и даже круче... ;->
все равно, если у тебя сотни соединений в секунду (образно выражаясь) fork накладен даже для таких серваков... Расточительно это... 
PM MAIL   Вверх
Sardar
Дата 13.7.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Цитата(AndrK @  13.7.2006,  15:10 Найти цитируемый пост)
Потоки менее нагружают систему... и хотя есть серваки которые ты описываешь и даже круче... ;->

Под линухом дочерний процесс может юзать тоже виртуальное пространство что и родительский процес, значит: 1) нет переключения контекстов (виртуальной памяти в смысле);  2) общая память, общие ресурсы.

В чём разница между тредами? А разница в том что структуры fork'анных "тредов" будут у шедулера вместе со структурами других процессов (поэтому их в списке процессов видно). Теряеться гибкость, нельзя дать приоритет процессу целиком (со всеми тредами "внутри", ибо они не "внутри" а являються дочерними процессами), да и вообще всё перемешанно получаеться. Чисто физически это раздельные процессы, просто у них поведение идеентично тредам.

pthreads это "реальные" треды, без всяких copy-on-write и прочих возможностей как у fork'анных "тредов", по идее должны быть быстрей...    


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
GrayCardinal
Дата 13.7.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Sardar
Быстрей, медленней. Главное - хвост smile 

Цитата
Ну если fork предпочтительнее

Пусть бред доказывает тот, кто его озвучил (с) Игорь Чупин.

Я к тому что рассуждение на тему fork VS pthread надо в Holy War. И для того чтоб решать что лучше для сервака, надо как минимум, иметь сервак. 


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1127 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.