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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> select функция в сокетах 
V
    Опции темы
Ak47black
  Дата 6.10.2010, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Здравствуйте.
Есть полностью рабочий код простого клиента и сервера 
(реализвация запроса содержания указанного каталога на сервере)
server.cpp
Код

#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <netinet/in.h>
#include <resolv.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include <dirent.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>



void* SocketHandler(void*);

int main(int argv, char** argc){
    int host_port= 1101;
    struct sockaddr_in my_addr; 

    int hsock;

    socklen_t addr_size = 0;
    int* csock;
    sockaddr_in sadr;

    hsock = socket(AF_INET, SOCK_STREAM, 0);
    if(hsock == -1){
        printf("Error initializing socket %d\n", errno);
        goto FINISH;
    }

    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(host_port);

    memset(&(my_addr.sin_zero), 0, 8);
    my_addr.sin_addr.s_addr = INADDR_ANY; 

    if( bind( hsock, (sockaddr*)&my_addr, sizeof(my_addr)) == -1 ){
        fprintf(stderr,"Error binding to socket, make sure nothing else is listening on this port %d\n",errno);
        goto FINISH;
    }
    if(listen( hsock, 10) == -1 )
    {
        fprintf(stderr, "Error listening %d\n",errno);
        goto FINISH;
    }

    addr_size = sizeof(sockaddr_in);

    printf("waiting for a connections\n");



    while(true){
        csock = (int*)malloc(sizeof(int));
        if((*csock = accept( hsock, (sockaddr*)&sadr, &addr_size))!= -1){
            printf("Received connection from %s\n---------------------\n",inet_ntoa(sadr.sin_addr)); 
            switch( fork()){   //daemonizavimas
                case -1:
                    fprintf(stderr, "Error spawning the child %d\n",errno);
                    break;
                case 0:
                    SocketHandler(csock);
                    break;
                default:
                    close(*csock);
                    free(csock);
                    break;
            }
        }
        else{
            fprintf(stderr, "Error accepting %d\n", errno);
        }
    }

FINISH:
    ;
}

void* SocketHandler(void* lp){

    int *csock = (int*)lp;

    char buffer[1024];
    int buffer_len = 1024;
    int bytecount;

    struct dirent *de=NULL;
    DIR *d=NULL;

    memset(buffer, 0, buffer_len);
    if((bytecount = recv(*csock, buffer, buffer_len, 0))== -1){
        fprintf(stderr, "Error receiving data %d\n", errno);
        goto FINISH;
    }

        printf("Sending dir='%s' files list.\n", buffer);
        d = opendir(buffer);
        if(d == NULL)
        {
            if((bytecount = send(*csock, "Couldn't open directory", 25, 0))== -1){
                fprintf(stderr, "Error sending data %d\n", errno);
                goto FINISH;
            }

            if((bytecount = recv(*csock, buffer, buffer_len, 0))== -1){
                    fprintf(stderr, "Error receiving data %d\n", errno);
                    goto FINISH;
            }
            
            buffer[0] = -1;
            if((bytecount = send(*csock, buffer, 1, 0))== -1){
                fprintf(stderr, "Error sending data %d\n", errno);
                goto FINISH;
            }
            
        }
        else
        {
              while((de = readdir(d)))
              {
                    if((bytecount = send(*csock, de->d_name, strlen(de->d_name), 0))== -1){
                        fprintf(stderr, "Error sending data %d\n", errno);
                        goto FINISH;
                    }
                    if((bytecount = recv(*csock, buffer, buffer_len, 0))== -1){
                            fprintf(stderr, "Error receiving data %d\n", errno);
                            goto FINISH;
                    }
              }
              buffer[0] = -1;
              if((bytecount = send(*csock, buffer, 1, 0))== -1){
                  fprintf(stderr, "Error sending data %d\n", errno);
                  goto FINISH;
              }
              closedir(d);
        }

    if((bytecount = send(*csock, buffer, strlen(buffer), 0))== -1){
        fprintf(stderr, "Error sending data %d\n", errno);
        goto FINISH;
    }

FINISH:
    shutdown(*csock, SHUT_RDWR);
    close(*csock);
    free(csock);
    return 0;
}

client.cpp
Код

#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <netinet/in.h>
#include <resolv.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

int main(int argv, char** argc){

    int host_port= 1101;
    char host_name[]="127.0.0.1";

    struct sockaddr_in my_addr;

    char buffer[1024];
    int bytecount;
    int buffer_len=0;

    int hsock;

    hsock = socket(AF_INET, SOCK_STREAM, 0);
    if(hsock == -1){
        printf("Error initializing socket %d\n", errno);
        goto FINISH;
    }

    my_addr.sin_family = AF_INET ;
    my_addr.sin_port = htons(host_port);
    
    memset(&(my_addr.sin_zero), 0, 8);
    my_addr.sin_addr.s_addr = inet_addr(host_name);


    if( connect( hsock, (struct sockaddr*)&my_addr, sizeof(my_addr)) == -1 ){
            fprintf(stderr, "Error connecting socket %d\n", errno);
            goto FINISH;
    }

    buffer_len = 1024;

    memset(buffer, '\0', buffer_len);

    while (buffer[0] == '\0')
    {
        printf("Enter diretory path\n");
        fgets(buffer, 1024, stdin);
        buffer[strlen(buffer)-1]='\0';
    }

    if( (bytecount=send(hsock, buffer, strlen(buffer),0))== -1)
    {
        fprintf(stderr, "Error sending data %d\n", errno);
        goto FINISH;
    }
        
    while (true)
    {
        if((bytecount = recv(hsock, buffer, buffer_len, 0))== -1)
        {
            fprintf(stderr, "Error receiving data %d\n", errno);
            goto FINISH;
        }
        if (buffer[0] == -1) goto FINISH;
        printf("%s\n", buffer);

        if( (bytecount=send(hsock, buffer, 1,0))== -1)
        {
            fprintf(stderr, "Error sending data %d\n", errno);
            goto FINISH;
        }
    }

    shutdown(hsock, SHUT_RDWR);
    close(hsock);
    
FINISH:
;
}

Мне нужно сделать что-бы была обяхательно использована select функция где-то.
Никогда этого не делал и ломаю голову где-бы вставить.
Подскажите пожалуйста как воспользоваться этим "зверем"?

Это сообщение отредактировал(а) Ak47black - 6.10.2010, 16:04
PM MAIL   Вверх
MAKCim
Дата 7.10.2010, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


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

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



почитайте (хотя бы man 2 select),  разберитесь, задавайте конкретные вопросы


Цитата(Ak47black @  6.10.2010,  15:55 Найти цитируемый пост)
Подскажите пожалуйста как воспользоваться этим "зверем"?

передать сокет в качестве параметра, указать ожидаемые события
далее вызовом select ждать их
далее обрабатывать (читать, писать данные или выдавать ошибку)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ak47black
  Дата 8.10.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

man select

Выдают справку по SQL
Нипонимаю сути существование функции select, так как можно обойтись и без неё.
Кто-нибудь может ясно и коротко объяснить для чего она нужна и что делает?

Это сообщение отредактировал(а) Ak47black - 8.10.2010, 16:00
PM MAIL   Вверх
boostcoder
Дата 8.10.2010, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(Ak47black @  8.10.2010,  16:00 Найти цитируемый пост)
Выдают справку по SQL

естественно smile 
написали же -
Цитата(MAKCim @  7.10.2010,  22:00 Найти цитируемый пост)
man 2 select


PM WWW   Вверх
Ak47black
Дата 8.10.2010, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

No manual entry for select in section 2

PM MAIL   Вверх
boostcoder
Дата 8.10.2010, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



значит не установлены ман страницы.
дистр какой?
PM WWW   Вверх
Ak47black
Дата 8.10.2010, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не мне установить никто не даст. Я университетским пользуюсь.

Добавлено через 1 минуту и 21 секунду
Подскажите хоть суть использования этой функции select?
Какая функция у меня её заменяет?
PM MAIL   Вверх
boostcoder
Дата 8.10.2010, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



тогда запомни этот урл: http://linux.die.net/man/2/select
там даже поиск есть smile 
PM WWW   Вверх
Ak47black
Дата 9.10.2010, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А можно-ли в моём коде применить эту select функцию не изменяя сильно код и не вызывая дополнительно FD_CLR, FD_ISSET, FD_SET, FD_ZERO ... 
Я просто вижу что тут надо очень много чего прочитать что-бы понять для чего она нужна. Понять сокеты Беркли и т.д. 
Честно говоря мне кажется что она исходит из более низкого уровня программирования сокетов? Это так?
Может Вы не могли-бы просто подсказать если видите что именно нужно мне поменять, у меня просто зачёт будет и вот надо что-бы она обязательно была  smile .

Это сообщение отредактировал(а) Ak47black - 9.10.2010, 21:29
PM MAIL   Вверх
boostcoder
Дата 9.10.2010, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(Ak47black @  9.10.2010,  21:28 Найти цитируемый пост)
Понять сокеты Беркли и т.д. 

раз уж вы кодите с использованием оных, то вы обязаны знать как они работаю.

Цитата(Ak47black @  9.10.2010,  21:28 Найти цитируемый пост)
Честно говоря мне кажется что она исходит из более низкого уровня программирования сокетов? Это так?

сокеты, это вообще низкий уровень. обычно используют обертки над ними. типа libevent, asio.

Цитата(Ak47black @  9.10.2010,  21:28 Найти цитируемый пост)
Может Вы не могли-бы просто подсказать если видите что именно нужно мне поменять, у меня просто зачёт будет и вот надо что-бы она обязательно была

показать не трудно. но задача на столько тривиальна, что складывается ощущение что вам просто влом smile 
PM WWW   Вверх
Ak47black
Дата 9.10.2010, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А есть как-нибудь хорошая статья где всё систематизировано написано?
Я не против разобратся, просто немогу найти достаточно хорошее "руководство"
PM MAIL   Вверх
boostcoder
Дата 9.10.2010, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



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


Эксперт
****


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

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



По второй ссылке очень хорошая статья.
Теперь понял. Спасибо 

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

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

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


 




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


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

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