LUẬN VĂN TỐT NGHỆP
Đề tài
XÂY DỰNG DỊCH VỤ TÍNH TOÁN PHÂN BỐ
(Distributed Computing Environment-DCE
MỤC LỤC
1 Giới thiệu 5
1.1 Sự hình thành bài toán 6
1.2 Bài toán 7
1.3 Các giả thuyết của bài toán: 8
1.4 Mô hình 8
1.5 Sơ lược về hoạt động hệ thống 10
2 Cơ sở lý thuyết 12
2.1 TCP/IP 13
2.1.1 Tổng quan về TCP/IP 14
2.1.2 Các lớp trong TCP/IP 16
2.1.3 Internet Protocol (IP) 19
2.1.4 Transmission Control Protocol (TCP) 22
2.1.5 User Datagram Protocol (UDP) 25
2.2 Berkeley sockets 26
2.2.1 Sự trừu tượng hóa socket 27
2.2.2 Các hàm hệ thống liên quan đến dịch vụ của cấp transport 28
2.3 Mô hình Client – Server 31
2.3.1 Xây dựng chương trình Client 32
2.3.2 Các loại Server 33
2.3.3 Xây dựng chương trình Server 34
2.4 Multicast 38
2.4.1 Giới thiệu 38
2.4.2 Broadcasting 40
2.4.3 Multicasting 41
2.4.4 IGMP : Internet Group Management Protocol 47
2.4.5 Quá trình Multicast 50
2.4.6 Làm sao viết một ứng dụng dùng Multicast trong Unix 53
2.4.7 Vấn đề tìm đường trong multicast: 56
2.5 Mô hình Group Communicatons 56
2.6 XDR (eXternal Data Representation) 59
2.6.1 Tại sao lại phải sử dụng XDR 59
2.6.2 Các kiểu dữ liệu chuẩn của XDR 60
2.6.3 Các thủ tục chuyển đổi 61
3 Phân tích ,thiết kế và hiện thực 62
3.1 Tổng kết phần cơ sở lý thuyết 62
3.2 Phân tích 64
3.2.1 Bài toán 64
3.2.2 Các giả thuyết của bài toán: 65
3.2.3 Phân tích bài toán và các giả thuyết 65
3.3 Các mô hình và lựa chọn mô hình 67
3.3.1 Chỉ dùng mô hình Client –Server 67
3.3.2 Dùng Client –Server kết hợp với Peer Group 68
3.3.3 Dùng Client –Server kết hợp với Hierarchical Group 69
3.4 Cấu trúc của hệ thống 69
3.5 Lưa chọn protocol và hoạt đọng của hệ thống 71
3.6 Phân tích chức năng 73
3.6.1 Admin 73
3.6.2 Agent 74
3.6.3 Server 74
3.6.4 Service 74
3.6.5 Client 75
3.6.6 Tools 75
3.7 Các giải thuật 75
3.7.1 Admin 75
3.7.2 Agent 75
3.7.3 Server 77
3.7.4 Giải thuật bầu chọn 78
3.7.5 Client 78
3.8 Hiện thực 80
3.8.1 Tổ chức dữ liệu 80
3.8.2 Quản lý timer 83
3.8.3 Socket giao tiếp 86
3.8.4 Tìm tất cả các host và user trên mạng 86
3.8.5 Tải trên hệ thống Sun-solaris , chọn Server tốt nhất 87
3.8.6 Hướng dẫn chương trình demo 89
3.9 Tổng kết 93
4 Phụ lục 94
4.1 Tài liệu tham khảo 94
4.2 Chương trình nguồn 96
4.2.1 _project 96
151 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2397 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Luận văn Xây dựng dịch vụ tính toán phân bố, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
dce_admin_getcommand ()
{
char *p = buf;
int i;
fprintf (stdout, "DCE >");
fgets (buf, MAXBUF, stdin);
strstandard (buf);
if (!buf[0])
return 0;
strcpy (_buf, buf);
argc = 0;
argv[argc] = buf;
while (*p)
{
if (*p == ' ')
{
argc++;
argv[argc] = p + 1;
(*p) = '\0';
}
p++;
}
argc++;
argv[argc] = NULL;
return argc;
}
/****************************************/
int
dce_admin_treat ()
{
pfunct_t p = f;
while (p->function)
{
if (strcmp (p->functname, argv[0]) == 0)
{
return p->function (argc, argv);
}
p++;
}
fprintf (stderr, "Bad command : %s\n", _buf);
return 0;
}
/****************************************/
int
dce_admin_quit (int argc, char **argv)
{
Admin.bExit = 1;
Admin.Msg.type = DCE_MSG_ADMIN_EXIT;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
return 1;
}
/****************************************/
int
dce_admin_help (int argc, char **argv)
{
pfunct_t p = f;
while (p->function)
{
fprintf (stderr, "%13s %s\n", p->functname, p->functhelp);
p++;
}
return 1;
}
/****************************************/
int
dce_admin_accept ()
{
int n = -1;
set_timeout ();
while (wait_timeout ())
if ((n = dce_socketaccept (Admin.nSocket)) > 0)
{
alarm (0);
return n;
}
return -1;
}
/****************************************/
int
dce_admin_mcastsend (char *buf, int len)
{
return dce_mcastsendsend (Admin.nMSockSend, Admin.maddr, Admin.mport, buf, len);
}
/****************************************/
int
dce_admin_listhostuser (int argc, char **argv)
{
dce_admin_listhost (1);
return 1;
}
/****************************************/
int
dce_admin_killall (int argc, char **argv)
{
Admin.Msg.type = DCE_MSG_KILLALL;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
return dce_admin_quit (argc, argv);
}
/****************************************/
int
dce_admin_findagent (int argc, char **argv)
{
int n;
fprintf (stderr, "Searching Agent ..... ");
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_AGENT_EXIST;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
if ((n = dce_admin_accept ()) <= 0)
{
fprintf (stderr, "Time out ! Agent not found !\n");
return 0;
}
if (read (n, (void *) &msg, sizeof (msg)) == sizeof (msg))
if (msg.type == DCE_MSG_AGENT_REPLY_ADMIN_EXIST)
{
fprintf (stderr, "Agent found at %s\n", ascaddr (msg.saddr));
close (n);
return 1;
}
close (n);
fprintf (stderr, "Error in read message \n");
return 0;
}
/****************************************/
int
dce_admin_startagent (int argc, char **argv)
{
char cmd[256];
char host[20];
char ssport[20];
char smport[20];
char *p = argv[1];
int n, code;
u_long u = gethostaddr (argv[1]);
if (dce_admin_findagent (argc, argv))
return 0;
if (u == -1)
{
fprintf (stderr, "Illegal hostname %s\n", argv[1]);
return 0;
}
if (u != getmyaddr ())
{
dce_admin_listhost (0);
if (!dce_admin_findhost (u))
{
fprintf (stderr, "%s is not on subnet\n", ascaddr (u));
return 0;
}
}
else
p = host;
sprintf (cmd, "%s/bin/%s/dceagent", Admin.szDCE_ROOT, gethostarch (argv[1]));
strcpy (host, (char *) ascaddrip (getmyaddr ()));
sprintf (smport, "%d", Admin.mport);
sprintf (ssport, "%d", Admin.Msg.sport);
if (!IsFileExist (cmd))
{
fprintf (stderr, "%s not found\n", cmd);
return 0;
}
if ((code = fork ()) < 0)
{
fprintf (stderr, "Can not fork process for agent\n");
return 0;
}
if (!code)
{
code = execlp ("/usr/bin/rsh", "rsh", p, cmd, Admin.szDCE_ROOT, ascaddrip (Admin.maddr), smport, host, ssport, "0", NULL);
if (code < 0)
fprintf (stderr, "Can not execlp %s\n", cmd);
exit (-1);
}
if ((n = dce_admin_accept ()) <= 0)
return 0;
if (read (n, (void *) &msg, sizeof (msg)) == sizeof (msg))
if (msg.type == DCE_MSG_AGENT_REPLY_ADMIN_FORK_SUCCESS)
fprintf (stderr, "Agent start successfully at %s\n", ascaddr (msg.saddr));
close (n);
return dce_admin_connectagent (argc, argv);
}
/****************************************/
int
dce_admin_connectagent (int argc, char **argv)
{
int n;
char buf[30];
if (Admin.bConnect)
return;
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_AGENT_CONNECT;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
if ((n = dce_admin_accept ()) <= 0)
{
fprintf (stderr, "Time out ! Agent not found !\n");
return 0;
}
if (read (n, (void *) &msg, sizeof (msg)) == sizeof (msg))
if (msg.type == DCE_MSG_AGENT_REPLY_ADMIN_ACCEPT_CONNECT)
{
strcpy (buf, ascaddr (msg.saddr));
fprintf (stderr, "Agent at %s accept connect with %s\n", buf, ascaddrip (getmyaddr ()));
close (n);
Admin.bConnect = 1;
return 1;
}
if (msg.type == DCE_MSG_AGENT_REPLY_ADMIN_REFUSE_CONNECT)
{
strcpy (buf, ascaddr (msg.saddr));
fprintf (stderr, "Agent at %s has connected with %s time %d s\n", buf, ascaddr (msg.aaddr), msg.nextra);
close (n);
Admin.bExit = 1;
return 0;
}
close (n);
fprintf (stderr, "Error in read message \n");
return 0;
}
int
dce_admin_disconnect (int argc, char **argv)
{
if (!Admin.bConnect)
return;
Admin.bConnect = 0;
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_AGENT_DISCONNECT;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
}
int
dce_admin_maxorder (int argc, char **argv)
{
int n;
if (!Admin.bConnect)
return;
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_AGENT_MAXORDER;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
if ((n = dce_admin_accept ()) <= 0)
{
fprintf (stderr, "Time out ! Agent not found !\n");
return 0;
}
if (read (n, (void *) &msg, sizeof (msg)) == sizeof (msg))
if (msg.type == DCE_MSG_AGENT_REPLY_ADMIN_MAXORDER)
{
fprintf (stderr, "Max order of Server List is %d\n", msg.nextra);
close (n);
return 1;
}
close (n);
fprintf (stderr, "Error in read message \n");
return 0;
}
int
dce_admin_server_is_running_on_host (int argc, char **argv)
{
int n;
u_long u = gethostaddr (argv[1]);
if (!Admin.bConnect)
return 0;
if (u == -1)
{
fprintf (stderr, "Illegal hostname %s\n", argv[1]);
return 0;
}
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_AGENT_SERONHOST;
Admin.Msg.aaddr = u;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
if ((n = dce_admin_accept ()) <= 0)
{
fprintf (stderr, "Time out ! Agent not found !\n");
return 0;
}
if (read (n, (void *) &msg, sizeof (msg)) == sizeof (msg))
if (msg.type == DCE_MSG_AGENT_REPLY_ADMIN_SERVERREADYRUN)
{
fprintf (stderr, "Server is running at %s\n", ascaddr (u));
close (n);
return 1;
}
else if (msg.type == DCE_MSG_AGENT_REPLY_ADMIN_NOSERVERONHOST)
{
fprintf (stderr, "No Server run at %s\n", ascaddr (u));
close (n);
return 0;
}
close (n);
fprintf (stderr, "Error in read message \n");
return 0;
}
int
dce_admin_startserver (int argc, char **argv)
{
char cmd[256];
char host[20];
char ssport[20];
char smport[20];
char smax[10];
char *p = argv[1];
int n, code;
u_long u = gethostaddr (argv[1]);
if (!Admin.bConnect)
return 0;
if (u == -1)
{
fprintf (stderr, "Illegal hostname %s\n", argv[1]);
return 0;
}
if (dce_admin_server_is_running_on_host (argc, argv))
return 0;
if (!dce_admin_maxorder (argc, argv))
return 0;
sprintf (smax, "%d", msg.nextra + 1);
if (u != getmyaddr ())
{
dce_admin_listhost (0);
if (!dce_admin_findhost (u))
{
fprintf (stderr, "%s is not on subnet\n", ascaddr (u));
return 0;
}
}
else
p = host;
sprintf (cmd, "%s/bin/%s/dceserver", Admin.szDCE_ROOT, gethostarch (argv[1]));
strcpy (host, (char *) ascaddrip (getmyaddr ()));
sprintf (smport, "%d", Admin.mport);
sprintf (ssport, "%d", Admin.Msg.sport);
if (!IsFileExist (cmd))
{
fprintf (stderr, "%s not found\n", cmd);
return 0;
}
if ((code = fork ()) < 0)
{
fprintf (stderr, "Can not fork process for agent\n");
return 0;
}
if (!code)
{
code = execlp ("/usr/bin/rsh", "rsh", p, cmd, Admin.szDCE_ROOT, ascaddrip (Admin.maddr), smport, host, ssport, smax, NULL);
if (code < 0)
fprintf (stderr, "Can not execlp %s\n", cmd);
exit (-1);
}
if ((n = dce_admin_accept ()) <= 0)
return 0;
if (read (n, (void *) &msg, sizeof (msg)) == sizeof (msg))
if (msg.type == DCE_MSG_SERVER_REPLY_ADMIN_FORK_SUCCESS)
fprintf (stderr, "Server start successfully at %s\n", ascaddr (msg.saddr));
close (n);
return 1;
}
int
dce_admin_listserver (int argc, char **argv)
{
int n;
SINFO s;
if (!Admin.bConnect)
return;
dce_admin_howmanyserver (argc, argv);
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_AGENT_LISTSERVER;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
if ((n = dce_admin_accept ()) <= 0)
{
fprintf (stderr, "Time out ! Agent not found !\n");
return 0;
}
while (read (n, (void *) &msg, sizeof (msg)) == sizeof (msg))
{
if (msg.type == DCE_MSG_END_OF_TRANSACTION)
{
fprintf (stderr, "End of transaction\n");
close (n);
return 1;
}
if (msg.type == DCE_MSG_AGENT_REPLY_ADMIN_SERVERINFO)
{
if (read (n, (void *) &s, sizeof (s)) == sizeof (s))
fprintf (stderr, "Server %s order %d status %d load %6.5f\n", ascaddr (s.addr), s.order, s.status, s.load);
}
}
close (n);
return 1;
}
int
dce_admin_killserver (int argc, char **argv)
{
u_long u = gethostaddr (argv[1]);
if (!Admin.bConnect)
return 0;
if (u == -1)
{
fprintf (stderr, "Illegal hostname %s\n", argv[1]);
return 0;
}
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_ALL_KILLSERVER;
Admin.Msg.aaddr = u;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
}
int
dce_admin_killagent (int argc, char **argv)
{
if (!Admin.bConnect)
return 0;
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_AGENT_KILLAGENT;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
Admin.bConnect = 0;
}
int
dce_admin_restart (int argc, char **argv)
{
char cmd[256];
char host[20];
char ssport[20];
char smport[20];
char *p = argv[1];
int n, code;
u_long u = gethostaddr (argv[1]);
if (!Admin.bConnect)
return 0;
if (!dce_admin_findagent (argc, argv))
return 0;
if (!dce_admin_countnumaliveserver (argc, argv))
return 0;
if (!msg.nextra)
return 0;
if (u == -1)
{
fprintf (stderr, "Illegal hostname %s\n", argv[1]);
return 0;
}
if (u == msg.saddr)
return 0;
if (u != getmyaddr ())
{
dce_admin_listhost (0);
if (!dce_admin_findhost (u))
{
fprintf (stderr, "%s is not on subnet\n", ascaddr (u));
return 0;
}
}
else
p = host;
dce_admin_killagent (argc, argv);
sprintf (cmd, "%s/bin/%s/dceagent", Admin.szDCE_ROOT, gethostarch (argv[1]));
strcpy (host, (char *) ascaddrip (getmyaddr ()));
sprintf (smport, "%d", Admin.mport);
sprintf (ssport, "%d", Admin.Msg.sport);
if (!IsFileExist (cmd))
{
fprintf (stderr, "%s not found\n", cmd);
return 0;
}
if ((code = fork ()) < 0)
{
fprintf (stderr, "Can not fork process for agent\n");
return 0;
}
if (!code)
{
code = execlp ("/usr/bin/rsh", "rsh", p, cmd, Admin.szDCE_ROOT, ascaddrip (Admin.maddr), smport, host, ssport, "0", NULL);
if (code < 0)
fprintf (stderr, "Can not execlp %s\n", cmd);
exit (-1);
}
if ((n = dce_admin_accept ()) <= 0)
return 0;
if (read (n, (void *) &msg, sizeof (msg)) == sizeof (msg))
if (msg.type == DCE_MSG_AGENT_REPLY_ADMIN_FORK_SUCCESS)
fprintf (stderr, "Agent restart successfully at %s\n", ascaddr (msg.saddr));
close (n);
return dce_admin_connectagent (argc, argv);
}
int
dce_admin_howmanyserver (int argc, char **argv)
{
int n;
if (!Admin.bConnect)
return;
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_AGENT_HOWSERVER;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
if ((n = dce_admin_accept ()) <= 0)
{
fprintf (stderr, "Time out ! Agent not found !\n");
return 0;
}
if (read (n, (void *) &msg, sizeof (msg)) == sizeof (msg))
if (msg.type == DCE_MSG_AGENT_REPLY_ADMIN_HOWSERVER)
{
fprintf (stderr, "Total servers: %2d on DCE system \n", msg.nextra);
close (n);
return 1;
}
close (n);
fprintf (stderr, "Error in read message \n");
return 0;
}
int
dce_admin_adduser (int argc, char **argv)
{
uid_t uid;
if (!Admin.bConnect)
return;
if (argc == 1)
return 0;
if ((uid = getuserid (argv[1])) < 0)
{
fprintf (stderr, "Illegal username %s\n", argv[1]);
return 0;
}
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_ALL_ADDUSER;
Admin.Msg.lextra = uid;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
return dce_admin_listperuser (argc, argv);
}
int
dce_admin_listperuser (int argc, char **argv)
{
int n;
if (!Admin.bConnect)
return;
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_AGENT_LISTUSER;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
if ((n = dce_admin_accept ()) <= 0)
{
fprintf (stderr, "Time out ! Agent not found !\n");
return 0;
}
while (read (n, (void *) &msg, sizeof (msg)) == sizeof (msg))
{
if (msg.type == DCE_MSG_END_OF_TRANSACTION)
{
fprintf (stderr, "End of transaction\n");
close (n);
return 1;
}
if (msg.type == DCE_MSG_AGENT_REPLY_ADMIN_USERINFO)
fprintf (stderr, "User :%s\n", ascuserid (msg.lextra));
}
close (n);
return 1;
}
int
dce_admin_deluser (int argc, char **argv)
{
uid_t uid;
if (!Admin.bConnect)
return;
if (argc == 1)
return 0;
if ((uid = getuserid (argv[1])) < 0)
{
fprintf (stderr, "Illegal username %s\n", argv[1]);
return 0;
}
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_ALL_DELUSER;
Admin.Msg.lextra = uid;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
return dce_admin_listperuser (argc, argv);
}
int
dce_admin_countnumaliveserver (int argc, char **argv)
{
int n;
if (!Admin.bConnect)
return;
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_AGENT_HOWMANYSERVERALIVE;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
if ((n = dce_admin_accept ()) <= 0)
{
fprintf (stderr, "Time out ! Agent not found !\n");
return 0;
}
if (read (n, (void *) &msg, sizeof (msg)) == sizeof (msg))
if (msg.type == DCE_MSG_AGENT_REPLY_ADMIN_HOWMANYSERVERALIVE)
{
fprintf (stderr, "Total alive servers: %2d on DCE system \n", msg.nextra);
close (n);
return 1;
}
close (n);
fprintf (stderr, "Error in read message \n");
return 0;
}
int
dce_admin_add_service (int argc, char **argv)
{
int i;
char cmd[256];
if (!Admin.bConnect)
return;
if (argc < 3)
{
fprintf (stderr, "%s servicename numparams\n", argv[0]);
return 0;
}
if (strlen (argv[1]) > MAXSERVICENAMELEN)
{
fprintf (stderr, "Service length too long :%s\n", argv[1]);
return 0;
}
sprintf (cmd, "%s/bin/%s/%s", Admin.szDCE_ROOT, sysinfo_hostarch (), argv[1]);
if (!IsFileExist (cmd))
{
fprintf (stderr, "File %s not found \n", cmd);
return 0;
}
i = atoi (argv[2]);
if (i < 0)
{
fprintf (stderr, "Parameter negative: %d\n", i);
return 0;
}
Admin.Msg.nextra = i;
strcpy (Admin.Msg.sername, argv[1]);
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_AGENT_ADDSERVICE;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
return dce_admin_listservice (argc, argv);
}
int
dce_admin_listservice (int argc, char **argv)
{
int n;
if (!Admin.bConnect)
return;
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_AGENT_LISTSERVICE;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
if ((n = dce_admin_accept ()) <= 0)
{
fprintf (stderr, "Time out ! Agent not found !\n");
return 0;
}
while (read (n, (void *) &msg, sizeof (msg)) == sizeof (msg))
{
if (msg.type == DCE_MSG_END_OF_TRANSACTION)
{
fprintf (stderr, "End of transaction\n");
close (n);
return 1;
}
if (msg.type == DCE_MSG_AGENT_REPLY_ADMIN_SERVICEINFO)
fprintf (stderr, "SERVICECODE %3d NAME %25s %d params\n", msg.pid, msg.sername, msg.nextra);
}
close (n);
return 1;
}
int
dce_admin_listcurusage (int argc, char **argv)
{
int n;
USERSERVICE us;
if (!Admin.bConnect)
return 0;
if (!dce_admin_listservice (argc, argv))
return 0;
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_AGENT_LISTCURUSERSERVICE;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
if ((n = dce_admin_accept ()) <= 0)
{
fprintf (stderr, "Time out ! Agent not found !\n");
return 0;
}
while (read (n, (void *) &msg, sizeof (msg)) == sizeof (msg))
{
if (msg.type == DCE_MSG_END_OF_TRANSACTION)
{
fprintf (stderr, "End of transaction\n");
close (n);
return 1;
}
if (msg.type == DCE_MSG_AGENT_REPLY_ADMIN_LISTCURUSERSERVICE)
if (read (n, (void *) &us, sizeof (us)) == sizeof (us))
{
fprintf (stderr, "\nUser %s from %s\n", ascuserid (us.uid), ascaddr (us.clientaddr));
fprintf (stderr, "using serive %d at server %s with pid %d\n", us.sernum, ascaddr (us.serveraddr), us.pid);
fprintf (stderr, "Begin time :%s", ctime (&us.tStart));
if (us.tEnd)
{
fprintf (stderr, "End time :%s", ctime (&us.tEnd));
fprintf (stderr, "Total of excutable time : %d (s)\n", us.tEnd - us.tStart);
}
else
{
fprintf (stderr, "Running with Status :%d\n", us.status);
fprintf (stderr, "Excuting time : %d (s)\n", time (NULL) - us.tStart);
}
}
}
close (n);
return 1;
}
int
dce_admin_load (int argc, char **argv)
{
double y, y1, y2, y3;
kstat_ctl_t *kc;
kstat_t *ksp;
void *vp;
if ((kc = kstat_open ()) == (void *) NULL)
return y;
if ((ksp = kstat_lookup (kc, "unix", 0, "system_misc")) == (void *) NULL)
return 0;
if (kstat_read (kc, ksp, NULL) == (kid_t) - 1)
return y;
if ((vp = kstat_data_lookup (ksp, "avenrun_1min")) == (void *) NULL)
return 0;
y = y3 = (double) (((kstat_named_t *) vp)->value.l) / (double) (FSCALE);
if ((vp = kstat_data_lookup (ksp, "avenrun_5min")) == (void *) NULL)
return 0;
y = y2 = (double) (((kstat_named_t *) vp)->value.l) / (double) (FSCALE);
if ((vp = kstat_data_lookup (ksp, "avenrun_15min")) == (void *) NULL)
return 0;
y = y1 = (double) (((kstat_named_t *) vp)->value.l) / (double) (FSCALE);
fprintf (stderr, "1 minute load average: %.2f\n", y3);
fprintf (stderr, "5 minute load average: %.2f\n", y2);
fprintf (stderr, "15 minute load average: %.2f\n", y1);
y = (y1 * 15 + y2 * 5 + y3) / 21;
fprintf (stderr, "Future value %.2f\n", y);
return 1;
}
int
dce_admin_listonusage (int argc, char **argv)
{
int n;
USERSERVICE us;
if (!Admin.bConnect)
return 0;
if (!dce_admin_listservice (argc, argv))
return 0;
Admin.Msg.type = DCE_MSG_ADMIN_REQUEST_AGENT_LISTCURUSERSERVICE;
dce_admin_mcastsend ((char *) &Admin.Msg, sizeof (MSG));
if ((n = dce_admin_accept ()) <= 0)
{
fprintf (stderr, "Time out ! Agent not found !\n");
return 0;
}
while (read (n, (void *) &msg, sizeof (msg)) == sizeof (msg))
{
if (msg.type == DCE_MSG_END_OF_TRANSACTION)
{
fprintf (stderr, "End of transaction\n");
close (n);
return 1;
}
if (msg.type == DCE_MSG_AGENT_REPLY_ADMIN_LISTCURUSERSERVICE)
if (read (n, (void *) &us, sizeof (us)) == sizeof (us))
{
if (!us.tEnd)
{
fprintf (stderr, "\nUser %s from %s\n", ascuserid (us.uid), ascaddr (us.clientaddr));
fprintf (stderr, "using serive %d at server %s with pid %d\n", us.sernum, ascaddr (us.serveraddr), us.pid);
fprintf (stderr, "Begin time :%s", ctime (&us.tStart));
fprintf (stderr, "Running with Status :%d\n", us.status);
fprintf (stderr, "Excuting time : %d\n", time (NULL) - us.tStart);
}
}
}
close (n);
return 1;
}
int
dce_admin_brstart (int argc, char **argv)
{
int i;
if (argc == 2)
i = atoi (argv[1]);
dce_netstat (i);
return 1;
}
int
dce_admin_listhoste (int argc, char **argv)
{
travelprinthost ();
}
Client
dce_matrix.c on Tue Nov 17 18:31:12 1998
#include
#include "dcec.h"
int readn (register int, register char *, register);
int writen (register int, register char *, register);
pmatrix
initmatrix (int type, int row, int col, void **ppvoid, mf_t f)
{
int i, j;
pmatrix pm = (pmatrix) malloc (sizeof (matrix));
if (!pm)
return NULL;
pm->type = type;
pm->row = row;
pm->col = col;
pm->_ppvoid = ppvoid;
if (f)
{
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
f (pm, i, j);
}
return pm;
}
pmatrix
newmatrix (int type, int row, int col, mf_t f)
{
int i, j;
pmatrix pm = (pmatrix) malloc (sizeof (matrix));
if (!pm)
return NULL;
pm->type = type;
pm->row = row;
pm->col = col;
pm->_ppvoid = NULL;
if (!(pm->_ppvoid = (void **) malloc (sizeof (void *) * row)))
{
free (pm);
return NULL;
}
for (i = 0; i < row; i++)
pm->_ppvoid[i] = NULL;
for (i = 0; i < row; i++)
if (!(pm->_ppvoid[i] = (void *) malloc (type * col)))
{
freematrix (pm);
return NULL;
}
if (f)
{
for (i = 0; i row; i++)
for (j = 0; j col; j++)
f (pm, i, j);
}
return pm;
}
void
freematrix (pmatrix pm)
{
int i;
if (pm->_ppvoid)
{
for (i = 0; i row; i++)
if (pm->_ppvoid[i])
free (pm->_ppvoid[i]);
}
free (pm);
}
int
writematrix (int fd, pmatrix pm)
{
int i;
if (writen (fd, (char *) &(pm->type), sizeof (pm->type)) < 0)
return -1;
if (writen (fd, (char *) &(pm->row), sizeof (pm->row)) < 0)
return -1;
if (writen (fd, (char *) &(pm->col), sizeof (pm->col)) < 0)
return -1;
for (i = 0; i row; i++)
if (writen (fd, (char *) (pm->_ppvoid[i]), pm->type * pm->col) < 0)
return -1;
return pm->row * pm->col;
}
pmatrix
readmatrix (int fd)
{
int i, type, row, col;
pmatrix pm;
if (readn (fd, (char *) &type, sizeof (type)) < 0)
return NULL;
if (readn (fd, (char *) &row, sizeof (row)) < 0)
return NULL;
if (readn (fd, (char *) &col, sizeof (col)) < 0)
return NULL;
if (!(pm = newmatrix (type, row, col, NULL)))
return NULL;
for (i = 0; i < row; i++)
if (readn (fd, (char *) (pm->_ppvoid[i]), type * col) < 0)
{
freematrix (pm);
return NULL;
}
return pm;
}
void
printmatrix (pmatrix pm, FILE * fo, mf_t fm)
{
int i, j;
FILE *f = (fo) ? fo : stderr;
fprintf (f, "\nSize of 1 element : %d bytes.Dim : %d row %d col\n", pm->type, pm->row, pm->col);
for (i = 0; i row; i++)
{
for (j = 0; j col; j++)
if (fm)
fm (pm, i, j);
fprintf (f, "\n");
}
}
int
readn (register int fd, register char *ptr, register nbytes)
{
int nread, nleft = nbytes;
while (nleft > 0)
{
nread = read (fd, ptr, nleft);
if (nread < 0)
return nread;
else if (nread == 0)
break;
nleft -= nread;
ptr += nread;
}
return nbytes - nleft;
}
int
writen (register int fd, register char *ptr, register nbytes)
{
int nwritten, nleft = nbytes;
while (nleft > 0)
{
nwritten = write (fd, ptr, nleft);
if (nwritten <= 0)
return nwritten;
nleft -= nwritten;
ptr += nwritten;
}
return nbytes - nleft;
}
dce_client.c on Thu Dec 24 03:12:34 1998
#include
#include "dce_client.h"
#define MAXCLIENTARGV 20
#define MAXREQUEST 3
#define CLIENTTIMEOUT 10*TIMEOUT_IAMALIVE+1
pmatrix
dce_service (const char *servicename, pmatrix pm,...)
{
pmatrix _pm[MAXCLIENTARGV], pt = pm;
ClientDes Client;
MSG msg;
int nParam = 0, nTimes = MAXREQUEST, nTimeOut = CLIENTTIMEOUT, fd;
va_list ap;
static char *_szwho[] =
{"ADMIN", "AGENT", "SERVER", "SERVICE", "CLIENT", "UNKNOWN", NULL};
static int i;
if (!i)
if (!dce_timer_init ())
return NULL;
else
i++;
if (!servicename)
{
#ifdef VIEW
fprintf (stderr, "Service name must not be NULL\n");
#endif
return NULL;
}
if (strlen (servicename) > MAXSERVICENAMELEN)
{
#ifdef VIEW
fprintf (stderr, "Length of Servicename %s very long \n", servicename);
#endif
return NULL;
}
Client.Msg.who = CLIENT;
Client.Msg.saddr = getmyaddr ();
Client.Msg.uid = getuid ();
Client.Msg.order = 0;
if (!dce_readconf (&Client.maddr, &Client.mport))
return NULL;
if ((Client.nMSockSend = dce_mcastsocksend ()) < 0)
return NULL;
if ((Client.nSocket = dce_socket (&Client.Msg.sport)) < 0)
return NULL;
va_start (ap, pm);
while (pt)
{
_pm[nParam] = pt;
nParam++;
if (nParam > MAXCLIENTARGV)
break;
pt = va_arg (ap, pmatrix);
}
va_end (ap);
#ifdef VIEW
fprintf (stderr, "Number of param %d \nUsername %s\n", nParam, ascuserid (Client.Msg.uid));
#endif
pt = NULL;
Client.Msg.type = DCE_MSG_CLIENT_REQUEST_AGENT_SERVICE;
Client.Msg.nextra = nParam;
strcpy (Client.Msg.sername, servicename);
while (nTimes--)
{
dce_mcastsendsend (Client.nMSockSend, Client.maddr, Client.mport, (char *) &Client.Msg, sizeof (MSG));
nTimeOut = CLIENTTIMEOUT;
Client.TimerId = dce_settimer (nTimeOut, dce_timerzero, (void *) &nTimeOut);
while (nTimeOut)
{
if ((fd = dce_socketaccept (Client.nSocket)) < 0)
continue;
dce_killtimer (Client.TimerId);
read (fd, &msg, sizeof (msg));
switch (msg.type)
{
/************************************************/
case DCE_MSG_AGENT_REPLY_CLIENT_NOSERVER:
#ifdef VIEW
fprintf (stderr, "Reply from %s %s :No server running on DCE system\n", _szwho[msg.who], ascaddr (msg.saddr));
#endif
close (fd);
close (Client.nMSockSend);
close (Client.nSocket);
return NULL;
break;
/************************************************/
case DCE_MSG_AGENT_REPLY_CLIENT_USERNOTFOUND:
#ifdef VIEW
fprintf (stderr, "Reply from %s %s :User %s not allowed on DCE system\n", _szwho[msg.who], ascaddr (msg.saddr), ascuserid (Client.Msg.uid));
#endif
close (fd);
close (Client.nMSockSend);
close (Client.nSocket);
return NULL;
break;
/************************************************/
case DCE_MSG_AGENT_REPLY_CLIENT_NOSERVICE:
#ifdef VIEW
fprintf (stderr, "Reply from %s %s :Service : %s not found on DCE system\n", _szwho[msg.who], ascaddr (msg.saddr), servicename);
#endif
close (fd);
close (Client.nMSockSend);
close (Client.nSocket);
return NULL;
break;
/************************************************/
case DCE_MSG_ALL_REPLY_CLIENT_ERROR:
#ifdef VIEW
fprintf (stderr, "Reply from %s %s :Error in data transfered to service : %s\n", _szwho[msg.who], ascaddr (msg.saddr), servicename);
#endif
close (fd);
close (Client.nMSockSend);
close (Client.nSocket);
return NULL;
break;
/************************************************/
case DCE_MSG_ALL_REPLY_CLIENT_PLEASEWAIT:
#ifdef VIEW
fprintf (stderr, "Reply from %s %s :Please wait the result of : %s\n", _szwho[msg.who], ascaddr (msg.saddr), servicename);
#endif
break;
/************************************************/
case DCE_MSG_SERVICE_REQUEST_CLIENT_DATA:
#ifdef VIEW
fprintf (stderr, "Request from %s %s : Transfer data : matrix %d\n", _szwho[msg.who], ascaddr (msg.saddr), msg.sport);
#endif
writematrix (fd, _pm[msg.sport]);
break;
/************************************************/
case DCE_MSG_SERVICE_REPLY_CLIENT_DATA:
sleep (1);
pt = readmatrix (fd);
#ifdef VIEW
fprintf (stderr, "Reply from %s %s : Receive result matrix ....", _szwho[msg.who], ascaddr (msg.saddr));
if (pt)
fprintf (stderr, "Successfully\n");
else
fprintf (stderr, "Error with failure!\n");
#endif
close (fd);
close (Client.nMSockSend);
close (Client.nSocket);
return pt;
break;
}
close (fd);
nTimeOut = CLIENTTIMEOUT;
Client.TimerId = dce_settimer (nTimeOut, dce_timerzero, (void *) &nTimeOut);
}
#ifdef VIEW
fprintf (stderr, "Request timeout .Retry !\n");
#endif
}
#ifdef VIEW
fprintf (stderr, "End of request with failure !\n");
#endif
close (Client.nMSockSend);
close (Client.nSocket);
return NULL;
}
Server
dce_server.c on Mon Dec 21 18:36:20 1998
#include
#include
#include "dce_server.h"
ServerDes Server;
MSG msg;
int dce_server_init (int, char **);
void dce_server_exit ();
int dce_agent_mcastrecv (char *buf, int len);
int dce_server_mcastsend (char *buf, int len);
void dce_server_alive (void *p);
void dce_server_election_agent (void *p);
void dce_server_fork_agent ();
void dce_msg_admin_request_all_killserver ();
void dce_msg_agent_request_server_broadcastdata ();
void dce_msg_admin_reqeust_agent_addservice ();
void dce_msg_client_request_agent_service ();
void dce_msg_agent_request_server_serve_client ();
void dce_msg_all_reply_client_pleasewait ();
void dce_msg_service_reply_all_finish ();
void dce_msg_all_reply_alluserservice ();
void dce_server_treat_for_electionagent ();
double dce_server_getload ();
void
main (int argc, char *argv[])
{
if (!dce_diamon ())
exit (-1);
if (!dce_server_init (argc, argv))
exit (-2);
while (!Server.bExit)
{
if (dce_server_mcastrecv ((char *) &msg, sizeof (MSG)) != sizeof (MSG))
continue;
switch (msg.who)
{
case ADMIN:
break;
case AGENT:
Server.AgentTime = 2 * TIMEOUT_IAMALIVE + 1;
dce_killtimer (Server.TimerIdElection);
break;
case SERVER:
dce_agent_update_newmsg ();
break;
case SERVICE:
break;
}
switch (msg.type)
{
case DCE_MSG_SERVER_ELECTION_AGENT:
case DCE_MSG_SERVER_ELECTED_AGENT:
dce_server_treat_for_electionagent ();
break;
case DCE_MSG_ALL_REPLY_ALL_USERSERVICE:
dce_msg_all_reply_alluserservice ();
break;
case DCE_MSG_ALL_REPLY_CLIENT_PLEASEWAIT:
dce_msg_all_reply_client_pleasewait ();
break;
case DCE_MSG_SERVICE_REPLY_ALL_FINISH:
dce_msg_service_reply_all_finish ();
break;
case DCE_MSG_AGENT_REQUEST_SERVER_SERVE_CLIENT:
dce_msg_agent_request_server_serve_client ();
break;
case DCE_MSG_AGENT_REQUEST_SERVER_BROADCASTDATA:
dce_msg_agent_request_server_broadcastdata ();
break;
case DCE_MSG_CLIENT_REQUEST_AGENT_SERVICE:
dce_msg_client_request_agent_service ();
break;
case DCE_MSG_ADMIN_REQUEST_AGENT_ADDSERVICE:
dce_msg_admin_reqeust_agent_addservice ();
break;
case DCE_MSG_ADMIN_REQUEST_ALL_ADDUSER:
AddUid (Server.pUserList, msg.lextra);
break;
case DCE_MSG_ADMIN_REQUEST_ALL_KILLSERVER:
dce_msg_admin_request_all_killserver ();
break;
case DCE_MSG_KILLALL:
Server.bExit = 1;
break;
}
}
}
int
dce_server_init (int argc, char **argv)
{
int i, n;
u_long u;
if (argc < 7)
return 0;
atexit (dce_server_exit);
Server.Msg.order = atoi (argv[6]);
Server.szDCE_ROOT = argv[1];
Server.maddr = gethostaddr (argv[2]);
Server.mport = atoi (argv[3]);
u = gethostaddr (argv[4]);
i = atoi (argv[5]);
Server.Msg.who = SERVER;
Server.Msg.saddr = getmyaddr ();
if (!(Server.pList = NewList ()))
return 0;
if (!(Server.pUserList = NewList ()))
return 0;
if (!(Server.pService = NewList ()))
return 0;
if (!(Server.pCurUserService = NewList ()))
return 0;
if ((Server.nMSockSend = dce_mcastsocksend ()) < 0)
return 0;
if ((Server.nMSockRecv = dce_mcastsockrecv (Server.maddr, Server.mport)) < 0)
return 0;
if ((Server.nSocket = dce_socket (&Server.Msg.sport)) < 0)
return 0;
if ((n = dce_connect (u, i)) > 0)
{
Server.Msg.type = DCE_MSG_SERVER_REPLY_ADMIN_FORK_SUCCESS;
write (n, (void *) &Server.Msg, sizeof (MSG));
close (n);
}
else
return 0;
dce_signal ();
if (!dce_timer_init ())
return 0;
Server.Msg.load = dce_server_getload ();
dce_server_alive (NULL);
Server.Msg.type = DCE_MSG_SERVER_REQUEST_AGENT_BROADCASTDATA;
dce_server_mcastsend ((char *) &Server.Msg, sizeof (MSG));
return 1;
}
void
dce_server_exit ()
{
FreeList (Server.pList, NULL);
FreeList (Server.pUserList, NULL);
FreeList (Server.pService, NULL);
FreeList (Server.pCurUserService, NULL);
dce_timer_free ();
dce_mcastcloserecv (Server.nMSockRecv, Server.maddr);
close (Server.nSocket);
close (Server.nMSockSend);
_cleanup ();
_exit ();
}
int
dce_server_mcastsend (char *buf, int len)
{
return dce_mcastsendsend (Server.nMSockSend, Server.maddr, Server.mport, buf, len);
}
int
dce_server_mcastrecv (char *buf, int len)
{
return dce_mcastrecvrecv (Server.nMSockRecv, Server.maddr, Server.mport, buf, len);
}
void
dce_server_alive (void *p)
{
char c = Server.Msg.type;
Server.Msg.type = DCE_MSG_IAMALIVE;
dce_server_mcastsend ((char *) &Server.Msg, sizeof (MSG));
dce_settimer (TIMEOUT_IAMALIVE, dce_server_alive, NULL);
dce_server_dcetime ();
DecTimeUserService (Server.pCurUserService);
if (Server.AgentTime > 0)
Server.AgentTime -= TIMEOUT_IAMALIVE;
else
{
Server.Msg.type = DCE_MSG_SERVER_ELECTION_AGENT;
dce_server_mcastsend ((char *) &Server.Msg, sizeof (MSG));
Server.TimerIdElection = dce_settimer ((Server.Msg.order - 1) * TIMEOUT_IAMALIVE, dce_server_election_agent, NULL);
}
Server.Msg.type = c;
}
void
dce_server_election_agent (void *p)
{
char c = Server.Msg.type;
if (dce_server_minorder () != Server.Msg.order)
return;
Server.Msg.type = DCE_MSG_SERVER_ELECTED_AGENT;
dce_server_mcastsend ((char *) &Server.Msg, sizeof (MSG));
Server.Msg.type = c;
dce_server_fork_agent ();
}
int
dce_server_accept ()
{
int n = -1;
int timeout = TIMEOUT;
int tid = dce_settimer (timeout, dce_timerzero, (char *) &timeout);
while (timeout)
{
if ((n = dce_socketaccept (Server.nSocket)) > 0)
{
dce_killtimer (tid);
return n;
}
}
return -1;
}
void
dce_server_fork_agent ()
{
char cmd[256];
char host[20];
char ssport[20];
char smport[20];
char smax[10];
int n, code;
MSG msg;
sprintf (cmd, "%s/bin/%s/dceagent", Server.szDCE_ROOT, sysinfo_hostarch ());
strcpy (host, (char *) ascaddrip (getmyaddr ()));
sprintf (smport, "%d", Server.mport);
sprintf (ssport, "%d", Server.Msg.sport);
sprintf (smax, "%d", Server.Msg.order);
if (!IsFileExist (cmd))
return;
if ((code = fork ()) < 0)
return;
if (!code)
{
code = execlp (cmd, cmd, Server.szDCE_ROOT, ascaddrip (Server.maddr), smport, host, ssport, smax, NULL);
exit (-1);
}
if ((n = dce_server_accept ()) <= 0)
return;
if (read (n, (void *) &msg, sizeof (msg)) == sizeof (msg))
if (msg.type == DCE_MSG_AGENT_REPLY_ADMIN_FORK_SUCCESS)
close (n);
}
void
dce_msg_admin_request_all_killserver ()
{
if (msg.aaddr == Server.Msg.saddr)
Server.bExit = 1;
else
dce_server_delete_server (msg.aaddr);
}
void
dce_msg_agent_request_server_broadcastdata ()
{
Server.Msg.type = DCE_MSG_ADMIN_REQUEST_ALL_ADDUSER;
dce_server_userbroadcast ();
Server.Msg.type = DCE_MSG_ADMIN_REQUEST_AGENT_ADDSERVICE;
dce_server_servicebroadcast ();
dce_server_userservicebroadcast ();
}
void
dce_msg_admin_reqeust_agent_addservice ()
{
AddService (Server.pService, msg.nextra, msg.sername);
}
void
dce_msg_client_request_agent_service ()
{
Server.Msg.type = DCE_MSG_IAMALIVE;
Server.Msg.load = dce_server_getload ();
dce_server_mcastsend ((char *) &Server.Msg, sizeof (MSG));
}
void
dce_msg_agent_request_server_serve_client ()
{
static char cmd[256];
static char smaddr[20];
static char smport[10];
static char seaddr[20];
static char seport[10];
static char suserid[10];
static char snparam[10];
static char sorder[10];
static char ssernum[10];
int n, code;
PSERVICEINFO p;
if (msg.aaddr != Server.Msg.saddr)
return;
sprintf (cmd, "%s/bin/%s/%s", Server.szDCE_ROOT, sysinfo_hostarch (), msg.sername);
if ((!IsFileExist (cmd)) || (!(p = (PSERVICEINFO) FindService (Server.pService, msg.sername))))
Server.Msg.type = DCE_MSG_ALL_REPLY_CLIENT_ERROR;
else
Server.Msg.type = DCE_MSG_ALL_REPLY_CLIENT_PLEASEWAIT;
if ((n = dce_connect (msg.saddr, msg.sport)) <= 0)
return;
write (n, (void *) &Server.Msg, sizeof (MSG));
close (n);
if (Server.Msg.type != DCE_MSG_ALL_REPLY_CLIENT_PLEASEWAIT)
return;
strcpy (smaddr, ascaddrip (Server.maddr));
sprintf (smport, "%d", Server.mport);
strcpy (seaddr, ascaddrip (msg.saddr));
sprintf (seport, "%d", msg.sport);
sprintf (suserid, "%d", msg.uid);
sprintf (snparam, "%d", msg.nextra);
sprintf (sorder, "%d", Server.Msg.order);
sprintf (ssernum, "%d", p->num);
if (!(code = fork ()))
{
code = execlp (cmd, cmd, smaddr, smport, seaddr, seport, suserid, snparam, sorder, ssernum, NULL);
exit (-1);
}
}
void
dce_msg_all_reply_client_pleasewait ()
{
PUSERSERVICE p = (PUSERSERVICE) FindUserService (Server.pCurUserService, msg.pid, msg.saddr);
if (p)
{
p->time = 2 * TIMEOUT_IAMALIVE + 1;
p->status = 1;
return;
}
if (p = (PUSERSERVICE) NewUserService (msg.pid, msg.saddr, msg.uid, msg.nextra, msg.aaddr, msg.lextra))
InsertList (Server.pCurUserService, (void *) p);
}
void
dce_msg_service_reply_all_finish ()
{
PUSERSERVICE p = (PUSERSERVICE) FindUserService (Server.pCurUserService, msg.pid, msg.saddr);
if (p)
{
p->tEnd = msg.lextra1;
p->time = -1;
p->status = 0;
return;
}
}
void
dce_msg_all_reply_alluserservice ()
{
PUSERSERVICE p = (PUSERSERVICE) FindUserService (Server.pCurUserService, msg.pid, msg.saddr);
if (p)
return;
if (!(p = (PUSERSERVICE) NewUserService (msg.pid, msg.saddr, msg.uid, msg.nextra, msg.aaddr, msg.lextra)))
return;
p->tEnd = msg.lextra1;
p->time = msg.sport;
p->status = (p->time > 0);
InsertList (Server.pCurUserService, (void *) p);
}
double
dce_server_getload ()
{
static double y;
double y1, y2, y3;
kstat_ctl_t *kc;
kstat_t *ksp;
void *vp;
if ((kc = kstat_open ()) == (void *) NULL)
return y;
if ((ksp = kstat_lookup (kc, "unix", 0, "system_misc")) == (void *) NULL)
return y;
if (kstat_read (kc, ksp, NULL) == (kid_t) - 1)
return y;
if ((vp = kstat_data_lookup (ksp, "avenrun_1min")) == (void *) NULL)
return y;
y = y3 = (double) (((kstat_named_t *) vp)->value.l) / (double) (FSCALE);
if ((vp = kstat_data_lookup (ksp, "avenrun_5min")) == (void *) NULL)
return y;
y = y2 = (double) (((kstat_named_t *) vp)->value.l) / (double) (FSCALE);
if ((vp = kstat_data_lookup (ksp, "avenrun_15min")) == (void *) NULL)
return y;
y = y1 = (double) (((kstat_named_t *) vp)->value.l) / (double) (FSCALE);
y = y3;
return y;
}
void
dce_server_treat_for_electionagent ()
{
char c = Server.Msg.type;
if (msg.order == Server.Msg.order)
return;
dce_killtimer (Server.TimerIdElection);
Server.Msg.type = DCE_MSG_IAMALIVE;
dce_server_mcastsend ((char *) &Server.Msg, sizeof (MSG));
Server.Msg.type = c;
}
dce_hinfo.c on Tue Dec 22 13:30:40 1998
#include
#include "dce_server.h"
PHINFO
NewHinfo (int order, u_long addr)
{
PHINFO p = (PHINFO) malloc (sizeof (HINFO));
if (!p)
return NULL;
p->order = order;
p->addr = addr;
p->status = 1;
p->time = 2 * TIMEOUT_IAMALIVE + 1;
return p;
}
void
DecTime (void *pt)
{
PHINFO p = (PHINFO) pt;
if (p->time >= 0)
p->time -= TIMEOUT_IAMALIVE;
else
p->status = 0;
}
void
dce_server_dcetime ()
{
TravelList (Server.pList, DecTime);
}
int _MinOrder;
void
MinOrder (void *pt)
{
PHINFO p = (PHINFO) pt;
if ((p->status == 1) && (_MinOrder > p->order))
_MinOrder = p->order;
}
int
dce_server_minorder ()
{
_MinOrder = MAXINT;
TravelList (Server.pList, MinOrder);
return _MinOrder;
}
int
cmpsinfo (void *p1, void *p2)
{
PHINFO p = (PHINFO) p1;
u_long *pu = (u_long *) p2;
if (*pu == p->addr)
{
p->status = 1;
p->time = 2 * TIMEOUT_IAMALIVE + 1;
return 1;
}
return 0;
}
void
dce_agent_update_newmsg ()
{
PHINFO p;
void **pr = ItemLookup (Server.pList, (void *) &msg.saddr, cmpsinfo);
if (pr)
{
free (pr);
return;
}
p = NewHinfo (msg.order, msg.saddr);
if (!p)
return;
InsertList (Server.pList, (void *) p);
}
int
cmppp (void *p1, void *p2)
{
PHINFO p = (PHINFO) p1;
u_long *pu = (u_long *) p2;
if (*pu == p->addr)
return 1;
return 0;
}
void
dce_server_delete_server (u_long u)
{
DeleteItem (Server.pList, (void *) &u, cmppp, NULL);
}
void
userbroadcast (void *p)
{
long *pl = (long *) p;
Server.Msg.lextra = *pl;
dce_server_mcastsend ((char *) &Server.Msg, sizeof (MSG));
}
void
dce_server_userbroadcast ()
{
TravelList (Server.pUserList, userbroadcast);
}
void
servicebroadcast (void *pt)
{
PSERVICEINFO p = (PSERVICEINFO) pt;
Server.Msg.nextra = p->param;
strcpy (Server.Msg.sername, p->sername);
dce_server_mcastsend ((char *) &Server.Msg, sizeof (MSG));
}
void
dce_server_servicebroadcast ()
{
TravelList (Server.pService, servicebroadcast);
}
void
userservicebroadcast (void *pt)
{
PUSERSERVICE p = (PUSERSERVICE) pt;
msg.type = DCE_MSG_ALL_REPLY_ALL_USERSERVICE;
msg.who = UNKNOWN;
msg.pid = p->pid;
msg.saddr = p->serveraddr;
msg.uid = p->uid;
msg.nextra = p->sernum;
msg.aaddr = p->clientaddr;
msg.lextra = p->tStart;
msg.lextra1 = p->tEnd;
msg.sport = p->time;
dce_server_mcastsend ((char *) &msg, sizeof (MSG));
}
void
dce_server_userservicebroadcast ()
{
TravelList (Server.pCurUserService, userservicebroadcast);
}
Service
dce_service1.c on Thu Dec 24 16:43:19 1998
#include "dce_service.h"
void
main (int argc, char *argv[])
{
pmatrix p1;
int i, j;
if (!dce_service_init (argc, argv))
exit (-1);
p1 = dce_get_matrix (0);
sleep (500);
dce_service_sendmatrix (p1);
}
dce_sum.c on Tue Jan 5 14:15:16 1999
#include
#include "dce_service.h"
#define MAXPARM 1
void
main (int argc, char *argv[])
{
int i, j;
pmatrix pm, p[MAXPARM];
if (!dce_service_init (argc, argv))
exit (-1);
if (Service.nParam < MAXPARM)
exit (-2);
for (i = 0; i < MAXPARM; i++)
if (!(p[i] = dce_get_matrix (i)))
dce_service_senderr ();
pm = newmatrix (sizeof (int), 1, 1, NULL);
pm->_ppint[0][0] = 0;
for (i = 0; i row; i++)
for (j = 0; j col; j++)
pm->_ppint[0][0] += p[0]->_ppint[i][j];
dce_service_sendmatrix (pm);
for (i = 0; i < MAXPARM; i++)
freematrix (p[i]);
freematrix (pm);
}
dce_addmatrix.c on Fri Jan 8 20:41:43 1999
#include
#include "dce_service.h"
#define MAXPARM 2
void
main (int argc, char *argv[])
{
int i, j;
pmatrix pm, p[MAXPARM];
if (!dce_service_init (argc, argv))
exit (-1);
if (Service.nParam < MAXPARM)
exit (-2);
for (i = 0; i < MAXPARM; i++)
if (!(p[i] = dce_get_matrix (i)))
dce_service_senderr ();
if ((p[0]->type != p[1]->type) || (p[0]->col != p[1]->col) || (p[0]->row != p[1]->row))
dce_service_senderr ();
if (!(pm = newmatrix (p[0]->type, p[0]->row, p[0]->col, NULL)))
dce_service_senderr ();;
for (i = 0; i row; i++)
for (j = 0; j col; j++)
pm->_ppint[i][j] = p[0]->_ppint[i][j] + p[1]->_ppint[i][j];
dce_service_sendmatrix (pm);
for (i = 0; i < MAXPARM; i++)
freematrix (p[i]);
freematrix (pm);
}
dce_revmatrix.c on Fri Jan 8 21:26:15 1999
#include
#include "dce_service.h"
#define MAXPARM 1
void
main (int argc, char *argv[])
{
int i, j;
pmatrix pm, p[MAXPARM];
if (!dce_service_init (argc, argv))
exit (-1);
if (Service.nParam < MAXPARM)
exit (-2);
for (i = 0; i < MAXPARM; i++)
if (!(p[i] = dce_get_matrix (i)))
dce_service_senderr ();
if (!(pm = newmatrix (p[0]->type, p[0]->col, p[0]->row, NULL)))
dce_service_senderr ();
for (i = 0; i row; i++)
for (j = 0; j col; j++)
pm->_ppint[i][j] = p[0]->_ppint[j][i];
dce_service_sendmatrix (pm);
for (i = 0; i < MAXPARM; i++)
freematrix (p[i]);
freematrix (pm);
}
dce_mulmatrix.c on Fri Jan 8 20:42:38 1999
#include
#include "dce_service.h"
#define MAXPARM 2
void
main (int argc, char *argv[])
{
int i, j, k;
pmatrix pm, p[MAXPARM];
if (!dce_service_init (argc, argv))
exit (-1);
if (Service.nParam < MAXPARM)
exit (-2);
for (i = 0; i < MAXPARM; i++)
if (!(p[i] = dce_get_matrix (i)))
dce_service_senderr ();
if ((p[0]->type != p[1]->type) || (p[0]->col != p[1]->row))
dce_service_senderr ();
if (!(pm = newmatrix (p[0]->type, p[0]->row, p[1]->col, NULL)))
dce_service_senderr ();;
for (i = 0; i row; i++)
for (j = 0; j col; j++)
{
pm->_ppint[i][j] = 0;
for (k = 0; k col; k++)
pm->_ppint[i][j] += p[0]->_ppint[i][k] * p[1]->_ppint[k][j];
}
dce_service_sendmatrix (pm);
for (i = 0; i < MAXPARM; i++)
freematrix (p[i]);
freematrix (pm);
}
Test
test1.c on Thu Dec 24 05:13:55 1998
#include
#include "dcec.h"
#define SIZE 10
#define SERVICENAME "service1"
void
main (int argc, char *argv[])
{
int i, j;
pmatrix p, p1 = newmatrix (sizeof (int), SIZE, SIZE, NULL);
printf ("Testing program at Client for %s service \n", SERVICENAME);
for (i = 0; i row; i++)
{
for (j = 0; j col; j++)
{
p1->_ppint[i][j] = i + j;
printf ("%4d ", p1->_ppint[i][j]);
}
printf ("\n");
}
if (!(p = dce_service (SERVICENAME, p1, NULL)))
exit (-1);
for (i = 0; i row; i++)
{
for (j = 0; j col; j++)
{
printf ("%4d ", p->_ppint[i][j]);
}
printf ("\n");
}
freematrix (p1);
freematrix (p);
}
test2.c on Tue Jan 5 14:25:35 1999
#include
#include "dcec.h"
#define SIZE 10
#define SERVICENAME "sum"
void
main (int argc, char *argv[])
{
int i, j;
pmatrix p, p1 = newmatrix (sizeof (int), SIZE, SIZE, NULL);
printf ("Testing program at Client for %s service \n", SERVICENAME);
for (i = 0; i row; i++)
{
for (j = 0; j col; j++)
{
p1->_ppint[i][j] = 1;
printf ("%4d ", p1->_ppint[i][j]);
}
printf ("\n");
}
if (!(p = dce_service (SERVICENAME, p1, NULL)))
exit (-1);
printf ("sum %4d\n", p->_ppint[0][0]);
freematrix (p1);
freematrix (p);
}
testaddmatrix.c on Fri Jan 8 21:05:09 1999
#include
#include "dcec.h"
#define SIZE 10
#define SERVICENAME "addmatrix"
void
main (int argc, char *argv[])
{
int i, j;
pmatrix p, p1 = newmatrix (sizeof (int), SIZE, SIZE, NULL), p2 = newmatrix (sizeof (int), SIZE, SIZE, NULL);
printf ("Testing program at Client for %s service \n", SERVICENAME);
printf ("Matrix 1\n");
for (i = 0; i row; i++)
{
for (j = 0; j col; j++)
{
p1->_ppint[i][j] = 1;
printf ("%4d ", p1->_ppint[i][j]);
}
printf ("\n");
}
printf ("Matrix 2\n");
for (i = 0; i row; i++)
{
for (j = 0; j col; j++)
{
p2->_ppint[i][j] = 2;
printf ("%4d ", p2->_ppint[i][j]);
}
printf ("\n");
}
if (!(p = dce_service (SERVICENAME, p1, p2, NULL)))
exit (-1);
printf ("Add matrix\n");
for (i = 0; i row; i++)
{
for (j = 0; j col; j++)
{
printf ("%4d ", p->_ppint[i][j]);
}
printf ("\n");
}
freematrix (p1);
freematrix (p2);
freematrix (p);
}
testrevmatrix.c on Fri Jan 8 21:37:10 1999
#include
#include "dcec.h"
#define SIZE 10
#define SERVICENAME "revmatrix"
void
main (int argc, char *argv[])
{
int i, j;
pmatrix p, p1 = newmatrix (sizeof (int), SIZE, SIZE, NULL);
printf ("Testing program at Client for %s service \n", SERVICENAME);
printf ("Matrix \n");
for (i = 0; i row; i++)
{
for (j = 0; j col; j++)
{
p1->_ppint[i][j] = j;
printf ("%4d ", p1->_ppint[i][j]);
}
printf ("\n");
}
if (!(p = dce_service (SERVICENAME, p1, NULL)))
exit (-1);
printf ("rev matrix\n");
for (i = 0; i row; i++)
{
for (j = 0; j col; j++)
{
printf ("%4d ", p->_ppint[i][j]);
}
printf ("\n");
}
freematrix (p1);
freematrix (p);
}
testmulmatrix.c on Fri Jan 8 21:51:47 1999
#include
#include "dcec.h"
#define SIZE 10
#define SERVICENAME "mulmatrix"
void
main (int argc, char *argv[])
{
int i, j;
pmatrix p, p1 = newmatrix (sizeof (int), SIZE, SIZE, NULL), p2 = newmatrix (sizeof (int), SIZE, SIZE, NULL);
printf ("Testing program at Client for %s service \n", SERVICENAME);
printf ("Matrix 1\n");
for (i = 0; i row; i++)
{
for (j = 0; j col; j++)
{
p1->_ppint[i][j] = 1;
printf ("%4d ", p1->_ppint[i][j]);
}
printf ("\n");
}
printf ("Matrix 2\n");
for (i = 0; i row; i++)
{
for (j = 0; j col; j++)
{
p2->_ppint[i][j] = 2;
printf ("%4d ", p2->_ppint[i][j]);
}
printf ("\n");
}
if (!(p = dce_service (SERVICENAME, p1, p2, NULL)))
exit (-1);
printf ("Mul matrix\n");
for (i = 0; i row; i++)
{
for (j = 0; j col; j++)
{
printf ("%4d ", p->_ppint[i][j]);
}
printf ("\n");
}
freematrix (p1);
freematrix (p2);
freematrix (p);
}
Tools
dce_monitor.c on Thu Dec 17 15:18:57 1998
#include
#include "dce_core.h"
u_long maddr;
int mport;
MSG msg;
int bExit;
int nMSockRecv;
static char * s[]={"ADMIN","AGENT","SERVER","SERVICE","CLIENT","UNKNOWN",NULL};
void main()
{
if (!(dce_readconf(&maddr,&mport))) exit(-1);
if ((nMSockRecv=dce_mcastsockrecv(maddr,mport))<0) exit(-2);
while (!bExit)
if (dce_mcastrecvrecv(nMSockRecv,maddr,mport,(char*)&msg,sizeof(MSG))!=sizeof(MSG)) continue;
else
{
fprintf(stderr,"%7s order %2d at %s %4d uid %5d Msg %2d Load %6.5f\n",s[msg.who],msg.order,ascaddrip(msg.saddr),msg.sport,msg.uid,msg.type,msg.load);
bExit=(msg.type==DCE_MSG_KILLALL);
}
dce_mcastcloserecv(nMSockRecv,maddr);}
dce_gencode.c on Thu Dec 31 13:22:49 1998
#include
#include
#include
void
main (int argc, char *argv[])
{
static char *s =
"File % s on % s ****************************************/
#include
#include \"dce_service.h\"
#define MAXPARM %s
void main (int argc, char *argv[])
{
int i, j;
pmatrix pm, p[MAXPARM];
if (!dce_service_init (argc, argv)) exit (-1);
if (Service.nParam < MAXPARM) exit (-2);
for (i = 0; i < MAXPARM; i++)
if (!(p[i] = dce_get_matrix (i))) dce_service_senderr ();
/*pm= */
dce_service_sendmatrix (pm);
for (i = 0; i < MAXPARM; i++) freematrix (p[i]);
freematrix (pm); }";
time_t t;
FILE * f;
if (argc < 3)
{
fprintf (stderr, "%s filename numparam\n", argv[0]);
exit (-1);
}
if (!(f = fopen (argv[1], "wt"))) return;
time (&t);
fprintf (f, s, argv[1], ctime (&t), argv[2]);
fclose (f);
}
Các file đính kèm theo tài liệu này:
- XÂY DỰNG DỊCH VỤ TÍNH TOÁN PHÂN BỐ (Distributed Computing Environment-DCE).doc