next up previous contents
Next: Другая функциональность Up: Установка соединения Previous: Зарезервированные значения ключей   Contents

Примеры клиент/сервер

Пример 3.3    Следующий пример показывает простейший способ использования интерфейса клиент/сервер. Он вообще не использует имена сервисов.

Со стороны сервера: char myportMPI_MAX_PORT_NAME;
MPI_Comm intercomm;
/* ... */
MPI_Open_port(MPI_INFO_NULL, myport);
printf(``port name is: %s$\backslash$n'', myport);
MPI_Comm_accept(myport, MPI_INFO_NULL, 0, MPI_COMM_SELF,
&intercomm);
/* выполнить что-либо с intercomm */

Сервер выводит имя порта на терминал, а пользователь должен ввести его при запуске клиента (предполагая, что реализация MPI поддерживает stdin таким образом, чтобы это работало).

Со стороны клиента: MPI_Comm interconm;
char nameMPI_MAX_PORT_NAME;
printf(``enter port name: '');
gets(name);
MPI_Comm_connect(name, MPI_INFO_NULL, 0, MPI_COMM_SELF,
&intercomm);

Пример 3.4    В этом примере приложение ``ocean'' является ``серверной'' частью связной модели климата океан-атмосфера. Оно предполагает, что реализация MPI публикует имена.

Со стороны сервера: MPI_Open_port(MPI_INFO_NULL, port_name);
MPI_Publish_name(``ocean'', MPI_INFO_NULL, port_name);

MPI_Comm_accept(port_name, MPI_INFO_NULL, 0, MPI_COMM_SELF,
&intercomm);
/* выполнить что-либо с intercomm */
MPI_Unpublish_name(``ocean'', MPI_INFO_NULL, port_name);

Со стороны клиента:

MPI_Lookup_name(``ocean'', MPI_INFO_NULL, port_name);
MPI_Comm_connect( port_name, MPI_INFO_NULL, 0, MPI_COMM_SELF,
&intercomm);

Пример 3.5    Это простой пример приложения клиент/сервер. Сервер принимает только одно соединение в один момент времени и обслуживает это соединение до получения сообщения с тегом 1, то есть, пока клиент не потребует рассоединения. Сообщение с тегом 0 приказывает серверу завершиться. Сервер является отдельным процессом.

#include``MPI.h''        
int main( int argc, char **argv )
$\lbrace$
MPI_Comm client;
MPI_Status status;
char port_nameMPI_MAX_PORT_NAME;
double bufMAX_DATA;
int size, again;

MPI_Init( &argc, &argv );
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (size != 1) error(FATAL, ``Server too big'');
MPI_Open_port(MPI_INFO_NULL, port_name);
printf (``server available at %s$\backslash$n'' ,port_name);
while (1) $\lbrace$
MPI_Comm_accept( port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD,
&client );
again = 1;
while (again) $\lbrace$
MPI_Recv( buf, MAX.DATA, MPI_DOUBLE,
MPI_ANY_SOURCE, MPI_ANY_TAG, client, &status );
switch (status.MPI_TAG) $\lbrace$
case 0: MPI_Comm_free( &client );
MPI_Close_port(port_name);
MPI_Finalize();
return 0;
case 1: MPI_Comm_disconnect( &client);
again = 0;
break;
case 2: /* выполнить что-либо */
...
default:
/* Неизвестный тип сообщения */
MPI_Abort( MPI_COMM_WORLD, 1);
$\rbrace$
$\rbrace$
$\rbrace$
$\rbrace$

Здесь приведен код клиента:

#include``MPI.h''                                
int main( int argc, char **argv )
$\lbrace$
MPI_Comm server;
double bufMAX_DATA;
char port_nameMPI_MAX_PORT_NAME;

MPI_Init( &argc, &argv );
strcpy(port_name, argv1); /* предположим, что имя сервера*/
/* - аргумент командной строки */
MPI_Comm_connect(port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD,
&server);
while (!done) $\lbrace$
tag = 2; /* Выполнить действие */
MPI_Send(buf, n, MPI_DOUBLE, 0, tag, server );
/* и т.д. */
$\rbrace$
MPI_Send(buf, 0, MPI_DOUBLE, 0, 1, server);
MPI_Comm_disconnect(&server);
MPI_Finalize();
return 0;
$\rbrace$


next up previous contents
Next: Другая функциональность Up: Установка соединения Previous: Зарезервированные значения ключей   Contents
Alex Otwagin 2002-12-10