ConnectDetach(coid);
return EXIT_SUCCESS;
exit (EXIT_FAILURE);
}
strcpy(send_buf, "Client: Answer");
printf("\nCLIENT: I send [%s]\n", &send_buf );
status=MsgSend(coid, &send_buf, sizeof(send_buf), &reply_buf, sizeof(reply_buf));
if (status==-1){
printf("Error MsgSend\n");
perror (NULL);
exit (EXIT_FAILURE);
}
if(strlen(reply_buf)>0){
printf("Pr : \"%s\"\n", reply_buf);
}
printf("\nEnd Client\n");
ConnectDetach(coid);
return EXIT_SUCCESS;
}
void *thread1( void *t )
{
int rcvid, chid, pid, ppid;
char receive_buf[25], reply_buf[25];
chid=ChannelCreate(0);
while(1){
rcvid=MsgReceive(chid, &receive_buf, sizeof(receive_buf), NULL);
printf("\nSERVER: I receive [%s]\n", &receive_buf );
strcpy(reply_buf, "Answer");
printf("\nSERVER: I reply [%s]\n", &reply_buf );
MsgReply(rcvid, 777, &reply_buf, sizeof(reply_buf));
}
ChannelDestroy(chid);
printf("\nEnd server\n" );
return EXIT_SUCCESS;
}
Результаты:
# ./th
1044526
CLIENT: I send [Client: Answer]
SERVER: I receive [Client: Answer]
SERVER: I reply [Answer]
Pr : "Answer"
End Client
Результат выполнения программы аналогичен предыдущему. В данном случае запускается только одна программа.
1.3. между независимыми процессами (с передачей pid)
Связь клиента сс сервером осуществляется посредством передачи в качестве аргумента pid процесса сервера.
client:
#include <sys/iofunc.h>
#include <sys/dispatch.h>
#include <stdlib.h>
int main (int argc,char* argv[])
{
int coid;
int status;
int pid=atoi(argv[1]);
char send_buf[25],
reply_buf[25];
printf("%d", pid );
coid=ConnectAttach(0,pid,1,0,0);
if (coid==-1){
printf("Error ConnectAttach\n");
perror (NULL);
exit (EXIT_FAILURE);
}
strcpy(send_buf, "Client: Answer");
printf("\nCLIENT: I send [%s]\n", &send_buf );
status=MsgSend(coid, &send_buf, sizeof(send_buf), &reply_buf, sizeof(reply_buf));
if (status==-1){
printf("Error MsgSend\n");
perror (NULL);
exit (EXIT_FAILURE);
}
if(strlen(reply_buf)>0){
printf("Pr : \"%s\"\n", reply_buf);
}
printf("\nEnd Client\n");
ConnectDetach(coid);
return EXIT_SUCCESS;
}
Server
#include <sys/iofunc.h>
#include <sys/dispatch.h>
#include <stdlib.h>
int main (void)
{
int rcvid, chid;
char receive_buf[25], reply_buf[25];
chid=ChannelCreate(0);
while(1){
rcvid=MsgReceive(chid, &receive_buf, sizeof(receive_buf), NULL);
printf("\nSERVER: I receive [%s]\n", &receive_buf );
strcpy(reply_buf, "Answer");
printf("\nSERVER: I reply [%s]\n", &reply_buf );
MsgReply(rcvid, 777, &reply_buf, sizeof(reply_buf));
}
ChannelDestroy(chid);
printf("\nEnd server\n" );
return EXIT_SUCCESS;
}
Откомпилируйте программы (gcc -o server server.c; gcc -o client client.c), запустите на выполнение исполняемые модули ./server и ./client, отправьте процессу server сигнал SIGINT.
Результаты:
#
# ./server&
[1] 2150438
# ./client 2150438
2150438
CLIENT: I send [Client: Answer]
SERVER: I receive [Client: Answer]
SERVER: I reply [Answer]
Pr : "Answer"
End Client
# kill SIGINT 2150438
[1] + Terminated ./server
#
После создания канала сервер вызывает функцию MsgReceive, и переходит в состояние Receive-block, пока ему не отправят сообщение. Клиент вызывает функции ConnectAttach, открывая при этом канал, через который он будет отсылать сообщение серверу. Посылка сообщения осуществляется с помощью команды MsgSend(), после которой клиент уходит в состояние Send-block, а сервер получает сообщение, обрабатывает его и отвечает клиенту с помощью функции MsgReply(). В рассмотренном случае сервер идентифицируется по своему PID.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.