int fd;
char sbuf[255], rbuf[255];
fd = name_open( PATH, 0 );
if( fd == -1 ){
printf("Client name open error ???\n" );
exit( EXIT_FAILURE );
}
strcpy( sbuf, "I am the client" );
MsgSend( fd, &sbuf[0], sizeof(sbuf), &rbuf[0], sizeof(rbuf) );
printf("CLIENT!!!\n Client get = %s \n", rbuf );
MsgSendPulse( fd, 10, 10, 5 );
name_close( fd );
return 0;
}
Пример вызова программы:
Script started on Wed Mar 31 04:36:52 2010
# ./serv
# ./client
SERVER tell with you!!!
Serv get msg = I am the client
CLIENT!!!
Client get = Hello Client!!
Server get pulse!
Server get pulse!
Пример использования функции MsgReceivePulse приведён ниже.
Листинг 7. Serv_Pilse.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/neutrino.h>
#include <sys/iomsg.h>
#include <sys/iofunc.h>
#include <sys/dispatch.h>
#define ATTACH_POINT "channel_lab1"
#define MY_PULSE1 _PULSE_CODE_MINAVAIL+1
#define MY_PULSE2 _PULSE_CODE_MINAVAIL+2
int main(){
name_attach_t *attach;
int rcvid, val;
struct _pulse pulse;
if ((attach = name_attach(NULL, ATTACH_POINT, 0)) == NULL) {
printf("name Attach fail ???\n");
return EXIT_FAILURE;
}
while(1){
rcvid = MsgReceivePulse( attach->chid, &pulse, sizeof( pulse ), NULL );
if( pulse.code > 0 ){
//User Pulse
switch( pulse.code ){
case MY_PULSE1:
printf("Get User Pulse 1 : value = %d\n", pulse.value.sival_int );
break;
case MY_PULSE2:
printf("Get User Pulse 2 : value = %d\n", pulse.value.sival_int );
break;
}//end switch
} else{
printf("Get system pulse\n");
if( pulse.code == _PULSE_CODE_DISCONNECT )
printf("Client disconnect\n");
}
}//end while(1)
name_detach(attach, 0);
return 0;
}
Листинг 8. Cl_pulse.c
#include <sys/neutrino.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/iofunc.h>
#include <sys/dispatch.h>
#define PATH "channel_lab1"
#define MY_PULSE1 _PULSE_CODE_MINAVAIL+1
#define MY_PULSE2 _PULSE_CODE_MINAVAIL+2
int main(){
int fd;
struct _pulse pulse;
fd = name_open( PATH, 0 );
if( fd == -1 ){
printf("Client name open error ???\n" );
exit( EXIT_FAILURE );
}
MsgSendPulse( fd, 10, MY_PULSE1, 18 );
MsgSendPulse( fd, 10, MY_PULSE2, 5 );
name_close( fd );
return 0;
}
Пример вызова программы:
# ./serv_pulse
# ./cl_pulse
Get User Pulse 1 : value = 18
Get User Pulse 2 : value = 5
Get system pulse
Client disconnect
4. Обработка запросов клиентов агентами
Создадим сервер, который не обрабатывает запросы, а перенаправляет их агентам. Таким образом, в начале работы сервер запускает агентов, они регистрируются у сервера и ожидают, пока сервер даст и работу. Когда клиент посылает серверу запрос, сервер сразу же перенаправляет его агенту и ждёт следующего запроса. Если же запросов от клиентов больше чем агентов, то этот запрос встаёт в очередь, и ждёт пока освободиться агент.
Serv.c
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/dispatch.h>
#include <string.h>
#include <process.h>
#define ATTACH_POINT "channel_lab1"
name_attach_t *attach;
struct _msg_info *info;
int nbyte=255, rcvid, num_agent=0, table[5], i, buf_rcvid, num_client=0, rcvid_tab[200];
char buf[255], msg[255], str[255], simb;
void send_to_agent();
int main(){
if ((attach = name_attach(NULL, ATTACH_POINT, 0)) == NULL) {
printf("name Attach fail ???\n");
return EXIT_FAILURE;
}
for( i=0; i< 5; i++ ){
spawnl( P_NOWAIT, "agent", "agent", NULL );
}
while(1){
rcvid = MsgReceive( attach->chid, &buf[0], sizeof(buf), NULL );
if( rcvid > 0 ){
printf("Server get message = %s\n", buf );
sscanf( buf, "%s %d %s", str, &buf_rcvid, msg);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.