Возможно вы искали: 'Dino SpeedBoat'

May 15 2025 18:29:58
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96111483
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18357
• Обзор The Walking ... 18801
• Обзор DMC: Devil M... 19879
• Обзор на игру Valk... 15877
• Обзор на игру Stars! 17764
• Обзор на Far Cry 3 17948
• Обзор на Resident ... 16024
• Обзор на Chivalry:... 17508
• Обзор на игру Kerb... 17981
• Обзор игры 007: Fr... 16619
Превью о играх
• Превью к игре Comp... 17960
• Превью о игре Mage... 14464
• Превью Incredible ... 14721
• Превью Firefall 13479
• Превью Dead Space 3 16334
• Превью о игре SimC... 14730
• Превью к игре Fuse 15442
• Превью Red Orche... 15542
• Превью Gothic 3 16343
• Превью Black & W... 17354
Главная » Статьи » Разное » Многопотоковые сервера в среде Linux. Техника разработки (rpc linux gcc )

Многопотоковые сервера в среде Linux. Техника разработки (rpc linux gcc )

Ключевые слова: rpc, linux, gcc, (найти похожие документы)

From: Б. А. Державец <dba477 at list.ru>
Newsgroups: email
Date: Mon, 26 May 2004 14:31:37 +0000 (UTC)
Subject: Многопотоковые сервера в среде Linux. Техника разработки

Приведенный ниже код является ответом на вопрос 23.10 из [1] стр.350
Однако, файлы dict_cif.c ( rdict_cif.c в [1] ) , содержащий пользовательский
код процедуры заглушки клиента, и dict.c (rdict.c в [1]), содержащий блок
main( ) клиента , исключены из рассмотрения.
Необходимо только модифицировать в соответствии с требованиями задачи
код dict_client.c , оригинал которого порождается rpcgen c опциями -a -M .
Изначально из [1] взяты только два файла dict.x (rdict.x в [1] стр.329)
и dict_srp (rdict_srp в [1] стр. 344 )



----------------------------------------------------------------------
Multithreaded RPC Servers in Linux environment.
Thread safe code writing is a must

This article is supposed to give a positive answer for the question 23.10 from
[1] Chapter "RPC".Originally only two files are taken from [1]: rdict.x and
rdict_srp.c. Note that all business logic is implemented into rdict_client.c
file, generated by "rpcgen a M rdict.x" command. So,files rdict.c and
rdict_cif (see [1] , Chapter "RPC") are just taken out.See for code details:
http://www.opennet.ru/base/dev/rpc_example.txt.html

References
1.Douglas E. Comer,David L. Stevens Internet Working with TCP/IP ,vol 3
Client-Server Programming and application Linux/Posix Socket Version,
Prentice Hall,Inc. 2001
--------------------------------------------------------------------------





Файл dict.x :

const MAXWORD=50;
const DICTSIZ=100;
struct example{
int exfield1;
char exfield2;
};
program RDICTPROG {
version RDICTVERS {
int INITW(void)=1;
int INSERTW(string)=2;
int DELETEW(string)=3;
int LOOKUPW(string)=4;
} =1;
} =0x30090949;



Файл dict_srp.c :

#include<rpc/rpc.h>
#include<string.h>
#include "dict.h"
char dict[DICTSIZ][MAXWORD+1];
static char snd[50];
static int lns;
int nwords=0;
int
initw()
{
nwords=0;
return 1;
}
int
insertw(char *word)
{
strcpy(dict[nwords],word);
nwords++;
return nwords;
}
int
deletew(char *word)
{
int i;
for(i=0;i<nwords;i++)
if(strcmp(word,dict[i])==0)
{
nwords--;
strcpy(dict[i],dict[nwords]);
return 1;
}
return 0;
}
int
lookupw(char *word)
{
int i;
for(i=0;i < nwords;i++)
if(strcmp(word,dict[i])==0)
return 1;
return 0;
}
rdictprog_1_freeresult(SVCXPRT *transp,xdrproc_t xdr_result,
caddr_t result)
{
xdr_free(xdr_result,result);
return(1);
}

Вызовем rpcgen для генерации кода заглушек xdr-файла и файла dict.h :

$rpcgen -a -M dict.x




Модифицированные файлы на стороне сервера (ср. rdict_sif.c из [1] стр.340 ):

/*
* dict_sif.c
*/
#include<rpc/rpc.h>
#define RPC_SVC
#include "dict.h"

int initw(void),insertw(char *),deletew(char *),lookupw(char *);
bool_t
insertw_1_svc(char **w,int *ptr_retcode,struct svc_req *rqstp)
{
*ptr_retcode=insertw(*(char **)w);
return(TRUE);
}
bool_t
initw_1_svc(void *w,int *ptr_retcode,struct svc_req *rqstp)
{
*ptr_retcode=initw();
return(TRUE);
}
bool_t
deletew_1_svc(char **w,int *ptr_retcode,struct svc_req *rqstp)
{
*ptr_retcode=deletew(*(char **)w);
return(TRUE);
}
bool_t
lookupw_1_svc(char **w,int *ptr_retcode,struct svc_req *rqstp)
{
*ptr_retcode=lookupw(*(char **)w);
return(TRUE);
}



Модифицированная заглушка сервера файл dict_svc.c .
Многопотоковая версия:

/* Modified dict_svc.c ( multithreaded version)
*
* Please do not edit this file.
* It was generated using rpcgen.
*/

#include "dict.h"
#include <stdio.h>
#include <stdlib.h>
#include <rpc/pmap_clnt.h>
#include <string.h>
#include <memory.h>
#include <sys/socket.h>
#include <netinet/in.h>

#ifndef SIG_PF
#define SIG_PF void(*)(int)
#endif
pthread_t p_thread;
pthread_attr_t attr;

/* Процедура выполняемая потоком */

void *
serv_request(void *data)
{
struct thr_data
{
struct svc_req *rqstp;
SVCXPRT *transp;
} *ptr_data;
union {
char *insertw_1_arg;
char *deletew_1_arg;
char *lookupw_1_arg;
char *showupw_1_arg;
char *getlenw_1_arg;
} argument;
union {
int initw_1_res;
int insertw_1_res;
int deletew_1_res;
int lookupw_1_res;
char showupw_1_res;
int getlenw_1_res;
} result;
bool_t retval;
xdrproc_t _xdr_argument, _xdr_result;
bool_t (*local)(char *, void *, struct svc_req *);

ptr_data = (struct thr_data *)data;
struct svc_req *rqstp = ptr_data->rqstp;
register SVCXPRT *transp = ptr_data->transp;

switch (rqstp->rq_proc) {
case NULLPROC:
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
return;

case INITW:
_xdr_argument = (xdrproc_t) xdr_void;
_xdr_result = (xdrproc_t) xdr_int;
local = (bool_t (*) (char *, void *, struct svc_req *))initw_1_svc;
break;

case INSERTW:
_xdr_argument = (xdrproc_t) xdr_wrapstring;
_xdr_result = (xdrproc_t) xdr_int;
local = (bool_t (*) (char *, void *, struct svc_req *))insertw_1_svc;
break;

case DELETEW:
_xdr_argument = (xdrproc_t) xdr_wrapstring;
_xdr_result = (xdrproc_t) xdr_int;
local = (bool_t (*) (char *, void *, struct svc_req *))deletew_1_svc;
break;

case LOOKUPW:
_xdr_argument = (xdrproc_t) xdr_wrapstring;
_xdr_result = (xdrproc_t) xdr_int;
local = (bool_t (*) (char *, void *, struct svc_req *))lookupw_1_svc;
break;
default:
svcerr_noproc (transp);
return;
}
memset ((char *)&argument, 0, sizeof (argument));
if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
svcerr_decode (transp);
return;
}
retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
if (retval > 0 && !svc_sendreply(transp, (xdrproc_t) _xdr_result, (char *)&result)) {
svcerr_systemerr (transp);
}
if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
fprintf (stderr, "%s", "unable to free arguments");
exit (1);
}
if (!rdictprog_1_freeresult (transp, _xdr_result, (caddr_t) &result))
fprintf (stderr, "%s", "unable to free results");

return;
}

/*
Принципиально измененный код процедуры rdictprog_1 ,
стартующей поток для каждого клиентского запроса
на запуск удаленной процедуры
*/


static void
rdictprog_1(struct svc_req *rqstp, register SVCXPRT *transp)
{
struct data_str
{
struct svc_req *rqstp;
SVCXPRT *transp;
} *data_ptr=(struct data_str*)malloc(sizeof(struct data_str));
data_ptr->rqstp = rqstp;
data_ptr->transp = transp;
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
pthread_create(&p_thread,&attr,serv_request,(void *)data_ptr);
}

int
main (int argc, char **argv)
{
register SVCXPRT *transp;

pmap_unset (RDICTPROG, RDICTVERS);

transp = svcudp_create(RPC_ANYSOCK);
if (transp == NULL) {
fprintf (stderr, "%s", "cannot create udp service.");
exit(1);
}
if (!svc_register(transp, RDICTPROG, RDICTVERS, rdictprog_1, IPPROTO_UDP)) {
fprintf (stderr, "%s", "unable to register (RDICTPROG, RDICTVERS, udp).");
exit(1);
}

transp = svctcp_create(RPC_ANYSOCK, 0, 0);
if (transp == NULL) {
fprintf (stderr, "%s", "cannot create tcp service.");
exit(1);
}
if (!svc_register(transp, RDICTPROG, RDICTVERS, rdictprog_1, IPPROTO_TCP)) {
fprintf (stderr, "%s", "unable to register (RDICTPROG, RDICTVERS, tcp).");
exit(1);
}

svc_run ();
fprintf (stderr, "%s", "svc_run returned");
exit (1);
/* NOTREACHED */
}





Сборка сервера:
$ gcc -o ServerDT dict_svc.c dict_sif.c dict_srp.c dict_xdr.c -lpthread -lnsl


Модифицированный файл dict_client.c (ср. rdict.c [1] стр. 341).
Образец создан командой: $rpcgen -a -M dict.x

/* dict_client.c измененный в соответствии с логикой приложения
*
* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
*/

#include "dict.h"
#define MAXWORD 50

char buf[80];
void
rdictprog_1(char *host)
{
CLIENT *clnt;
enum clnt_stat retval_1;
int result_1;
char *initw_1_arg="0";
enum clnt_stat retval_2;
int result_2;
char * insertw_1_arg;
enum clnt_stat retval_3;
int result_3;
char * deletew_1_arg;
enum clnt_stat retval_4;
int result_4;
char * lookupw_1_arg;
int ch;
char cmd;
char word[MAXWORD+1];
int wrdlen;

#ifndef DEBUG
clnt = clnt_create (host, RDICTPROG, RDICTVERS, "udp");
if (clnt == NULL) {
clnt_pcreateerror (host);
exit (1);
}
#endif /* DEBUG */
while(1)
{
wrdlen=nextin(&cmd,word);
if(wrdlen < 0)
exit(0);
word[wrdlen]='';
switch(buf[0])
{
case 'I':
retval_1 = initw_1((void*)&initw_1_arg, &result_1, clnt);
if (retval_1 != RPC_SUCCESS) {
clnt_perror (clnt, "call failed");
}
if (result_1 == 1)
printf("Dictionary was initialized n");
else
printf("Dictionary failed to initialize n");
break;
case 'i':
insertw_1_arg=word;
retval_2 = insertw_1(&insertw_1_arg, &result_2, clnt);
if (retval_2 != RPC_SUCCESS) {
clnt_perror (clnt, "call failed");
}
if (result_2 >0 )
printf("Insert was donen");
else
printf("Insert failedn");
break;
case 'd':
deletew_1_arg=word;
retval_3 = deletew_1(&deletew_1_arg, &result_3, clnt);
if (retval_3 != RPC_SUCCESS) {
clnt_perror (clnt, "call failed");
}
if (result_3 == 1 )
printf("Delete was donen");
else
printf("Delete failedn");
break;
case 'l':
lookupw_1_arg=word;
retval_4 = lookupw_1(&lookupw_1_arg, &result_4, clnt);
if (retval_4 != RPC_SUCCESS) {
clnt_perror (clnt, "call failed");
}
if (result_4 == 1)
printf("Word '%s' was foundn",word);
else
printf("Word '%s' was not foundn",word);
break;
case 'q':
printf("Programm quits n");
exit(0);
default:
printf("Command invalidn");
break;
}
}
#ifndef DEBUG
clnt_destroy (clnt);
#endif /* DEBUG */
}
int
nextin(char *cmd,char *word)
{
int i,ch;
printf("n");
printf("***** Make a choice ******n");
printf("1. I(initialize dictionary)n");
printf("2. i(inserting word) n");
printf("3. l(looking for word)n");
printf("4. d(deleting word)n");
printf("5. q(quit)n");
printf("***************************n");
printf("Command prompt =>t");
ch=getc(stdin);
while(isspace(ch))
ch=getc(stdin);
if(ch==EOF)
return -1;
*cmd=(char)ch;
sprintf(buf,"%s",cmd);
if(buf[0] == 'q' || buf[0] == 'I')
return 0;
printf("*****************n");
printf("Analysing Commandn");
printf("*****************n");
if(buf[0]=='i' || buf[0]=='l'|| buf[0]=='d')
{
printf("Input word =>t");
}
else
{
return 0;
}
ch=getc(stdin);
while(isspace(ch))
ch=getc(stdin);
if(ch==EOF)
return -1;
if(ch=='n')
return 0;
i=0;
while(!isspace(ch))
{
if(++i>MAXWORD)
{
printf("Error word to long.n");
exit(1);
}
*word++=ch;
ch=getc(stdin);
}
return i;
}
int
main (int argc, char *argv[])
{
char *host;

if (argc < 2) {
printf ("usage: %s server_hostn", argv[0]);
exit (1);
}
host = argv[1];
rdictprog_1 (host);
exit (0);
}





Сборка клиента:
$ gcc -o CientDT dict_client.c dict_clnt.c dict_xdr.c -lnsl

Теперь все готово для тестирования.


Литература

1.Дуглас Э. Крамер,Дэвид Л. Стивенс. Сети TCP/IP .Разработка приложений
типа клиент/сервер для LINUX/POSIX . Том 3 .Издательский дом
"Вильямс",2002.

2. http://www.opennet.ru/base/dev/pthread_select_server.txt.html
717 Прочтений •  [Многопотоковые сервера в среде Linux. Техника разработки (rpc linux gcc )] [08.05.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Многопотоковые сервера в среде Linu... Ukraine Vova 08.05.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка