Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > многопоточный сервер


Автор: admsasha 26.4.2005, 11:45
Код

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 - первый клиент


собственно говоря, что у меня не так ?

Автор: GrayCardinal 26.4.2005, 16:04
Цитата
(n = read(sock, line, 100) > 0)

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

Цитата
free(p);

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

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

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

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

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


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

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

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

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


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

Автор: dargaard 26.4.2005, 21:31
free(p); вообше убери

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

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

Автор: admsasha 27.4.2005, 02:28
А почему процесы то создаются ??

Код

# 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


Автор: dargaard 27.4.2005, 10:49
1. На некоторых системах потоки выводятся в списке процессов.

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

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


Так и pid`ы разные ?
у меня Mandrake Linux 10.1

Автор: achmed 28.4.2005, 08:36
В Linux потоки реализованы как процессы с разделяемым контекстом.

И еще раз man socket !!!

Автор: 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 предпочтительней.

Автор: bilbobagginz 29.4.2005, 23:42
мдяаааа....
вам батенька ( 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/workshops/workshop/pthreads/MAIN.html#Overview

Автор: AndrK 13.7.2006, 16:10
Цитата(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 накладен даже для таких серваков... Расточительно это... 

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

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

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

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

Автор: GrayCardinal 13.7.2006, 18:37
Sardar, 
Быстрей, медленней. Главное - хвост smile 

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)