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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TCP/IP параллельной обработки запросов 
:(
    Опции темы
zhenya1
Дата 24.4.2011, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здаравствуйте, у меня такое задание:
Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием отдельного процесса для обработки каждого запроса. На сервере хранится список книг, хранящихся в библиотеке. Каждая запись списка содержит следующую информацию о книгах
- регистрационный номер книги,
- автор;
- год издания;
- издательство;
- количество страниц.
Таких записей должно быть не менее 5. 
Клиент посылает на сервер фамилию интересующего его автора. Назад он получает список книг указанного автора.

В общем, вроде почти все организовано.
Проблема: Как можно в buf на посылку клиенту закинуть и год издания, и номер книги , и издательство, и кол-во страниц.

Т.е. результат работы хотелось бы такой:
Отправляю серверу фамилию, например, "Ivanov" и получаю Ivanov Ivan Ivanovich 2 2010 20 10

Клиент:

Код

int main(){
    struct sockaddr_in peer;
    int s,t,t1;
    int rc;
    char buf[256],p,p1,b[256];;

    peer.sin_family=AF_INET;
    peer.sin_port=htons(7500);
    peer.sin_addr.s_addr=inet_addr("127.0.0.1");

    s=socket(AF_INET,SOCK_STREAM,0);
    rc=connect(s,(struct sockaddr *)&peer,sizeof(peer));
int true=1;
while(true){
    //Выбор пункта меню и отправка его серверу            
    puts("Choose:");
    puts("\t1 - Select");
    puts("\t3 - View");
    puts("\t4 - Exit");
    scanf("%s",buf);
    buf[1]='\0';
    send(s,buf,sizeof(buf),0);
    p=buf[0];

    switch (p){
    case '1'://Выбрать
        puts("fio:");scanf("%s",buf);
        send(s,buf,sizeof(buf),0);

        printf("result: ");
        recv(s,buf,sizeof(buf),0);
printf("%s",buf);
        
        printf("\n");
        break;
    
    case '3'://Просмотреть 5 записей
        recv(s,buf,sizeof(buf),0);printf("%s",buf);
        recv(s,buf,sizeof(buf),0);printf("%s",buf);
        recv(s,buf,sizeof(buf),0);printf("%s",buf);
        recv(s,buf,sizeof(buf),0);printf("%s",buf);
        recv(s,buf,sizeof(buf),0);printf("%s",buf);

        break;    
    case '4'://Выход
        exit(0);
    
            
    }
}
}


Сервер:

Код

struct Employee{
    char name[35];
    char number[10];
    char year[10];
    char publishing[10];
         char pages[10];
} em[5];

// процедура для обслуживания соединения
int Func(int newS){

    long int i,num,t, mon, doh, nal;
    float sum;
    int m,true=1;
    char p,p1,s;
    char buf[256],b[256];
    while (true){
        

        recv(newS,buf,sizeof(buf),0);

recv(newS,buf,sizeof(buf),0);
printf("%s",buf);


send(newS,buf,sizeof(buf),0);

break;
}
}

void reaper(int sig){
    int status;
    while (wait3(&status,WNOHANG,(struct rusage*)0)>=0);
}

int main(){
        strcpy(em[1].name,"Sergeev Sergei Sergeevich");
        strcpy(em[1].number,"1");
        strcpy(em[1].year,"2009");
        strcpy(em[1].publishing,"10");
                    strcpy(em[1].pages,"10");    
        
        strcpy(em[2].name,"Ivanov Ivan Ivanovich");
        strcpy(em[2].number,"2");
        strcpy(em[2].year,"2010");
        strcpy(em[2].publishing,"20");
                    strcpy(em[2].pages,"10");    
        
        strcpy(em[3].name,"Vladimirov Vladimir Vladimirovich");
        strcpy(em[3].number,"3");
        strcpy(em[3].year,"2011");
        strcpy(em[3].publishing,"30");    
                    strcpy(em[3].pages,"10");
    
        
        strcpy(em[4].name,"Sidorov Sidor Sidorovich ");
        strcpy(em[4].number,"4");
        strcpy(em[4].year,"2012");
        strcpy(em[4].publishing,"40");    
                    strcpy(em[4].pages,"10");
        
        strcpy(em[5].name,"Vasilev Vasilii Vasilievich");
        strcpy(em[5].number,"5");
        strcpy(em[5].year,"2013");
        strcpy(em[5].publishing,"50");
                    strcpy(em[5].pages,"10");
    
        
    
        struct sockaddr_in local;
        int s,
            newS,
            rc;
    
        
        local.sin_family=AF_INET;
        local.sin_port=htons(7500);
        local.sin_addr.s_addr=htonl(INADDR_ANY);
        
        s=socket(AF_INET, SOCK_STREAM,0);
        rc=bind(s,(struct sockaddr *)&local, sizeof(local));
        rc=listen(s,5);
        (void)signal(SIGCHLD,reaper);
        int true =1;
        while(true){
            newS=accept(s,NULL,NULL);
            switch (fork()){
            case 0:
                (void)close(s);
                exit(Func(newS));
            default:
                (void)close(newS);
                }
        
        
        }
        
        
        
        return 0;
}

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


Вольноопределяющийся
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 16.6.2008
Где: Спасск-Дальний

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



Цитата(zhenya1 @  24.4.2011,  20:36 Найти цитируемый пост)
Как можно в buf на посылку клиенту закинуть и год издания, и номер книги , и издательство, и кол-во страниц.

А в чем, собственно, проблема?
Создай буфер соответствующего размера и копируй в него все, что захочеш.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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