strcpy( buf, "sending msg!!!" );
MsgSend( coid, buf, 255, rbuf, 255 );
printf("CLIENT!!!\n Client get msg = %s \n", rbuf );
return 0;
}
Результат выполнения программы:
# ./serv& [1] 708652
# SERV create channel = 1 ; PID server = 708652
./client 1 708652
SERVER tell with you!!!
Server get msg = sending msg!!!
CLIENT!!!
Client get msg = Server get msg!
[1] + Done ./serv
2.3. Регистрация сервера по имени
Для регистрации сервера по имени используется функция:
FILE* popen( const char* command,
const char* mode );
С помощью этой функции мы используя команду pidin находим pid сервера, и подключаемся к нему с помощью команды ConnectAttach.
FILE *f;
f = popen("pidin | grep ./serv", "r" );
Serv.c
#include <sys/neutrino.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
int rcvid, nbyte=255;
char buf[255], chid_s[10];
pid_t chid ;
struct _msg_info* info;
chid = ChannelCreate( 0 );
printf("SERV create channel = %d\n", chid);
rcvid = MsgReceive( chid, buf, nbyte, info );
if( rcvid > 0 ){
// Message
printf( "SERVER tell with you!!!\n Server get msg = %s\n", buf );
if( MsgReply( rcvid, 0, "Server get msg!", nbyte ) == -1 )
printf("SERVER???\n Don't Reply message to client\n");
}
return 0;
}
Client.c
#include <sys/neutrino.h>
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char** argv ){
int coid, nbyte=255, chid, ppid;
char buf[255], rbuf[255];
struct _msg_info* info;
FILE *f;
f = popen("pidin | grep ./serv", "r" );
fscanf( f, "%s", buf );
ppid = atoi( buf );
chid = atoi( argv[1] );
//ppid = atoi( argv[2] );
coid = ConnectAttach( 0, ppid, chid, 0, 0 );
if( coid == -1 ){
printf("Error connect ID???\n");
exit( EXIT_FAILURE );
}
strcpy( buf, "sending msg!!!" );
MsgSend( coid, buf, 255, rbuf, 255 );
printf("CLIENT!!!\n Client get msg = %s \n", rbuf );
return 0;
}
Результат выполнения программы:
# ./serv& [1] 1540143
# SERV create channel = 1
./client 1 SERVER tell with you!!!
Server get msg = sending msg!!!
CLIENT!!!
Client get msg = Server get msg!
[1] + Done ./serv
#
3. Передачапульсов
В отличии от сообщений, пульсы не требуют ответа. Т.е. клиент пославший пульс не перейдёт в состояние Send-block, а продолжит выполняться.
Сервер может принимать пульсы как с помощью функции MsgReceivePulse(), так и с помощью MsgReceive(). При использовании функции MsgReceive оповещением о том, что пришёл пульс будет равенство нулю выходного значения.
Использование функции MsgReceive для приёма пульсов показано на примере в программах приведенных ниже.
Листинг 5. Server.c
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/dispatch.h>
#include <string.h>
#define ATTACH_POINT "channel_lab1"
typedef struct _my_date{
struct _pulse pulse;
char buf[255];
} my_dat;
int main(){
name_attach_t *attach;
struct _msg_info *info;
int nbyte=255, rcvid, val;
char buf[255];
my_dat dat;
if ((attach = name_attach(NULL, ATTACH_POINT, 0)) == NULL) {
printf("name Attach fail ???\n");
return EXIT_FAILURE;
}
while(1){
rcvid = MsgReceive( attach->chid, &buf[0], sizeof(buf), NULL );
if( rcvid > 0 ){
//Message
printf("SERVER tell with you!!!\n Serv get msg = %s\n", buf );
strcpy( buf, "Hello Client!!" );
MsgReply( rcvid, 0, &buf[0], sizeof( buf ) );
} else if( rcvid == 0 ){
//Pulse
printf("Server get pulse!\n" );
}
}//end while(1)
name_detach(attach, 0);
return 0;
}
Листинг 6. Client.c
#include <sys/neutrino.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/iofunc.h>
#include <sys/dispatch.h>
#define PATH "channel_lab1"
int main(){
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.