Шустрый

Профиль
Группа: Участник
Сообщений: 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; }
|
|