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_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;