Professional Documents
Culture Documents
Bai 10.1 XDR
Bai 10.1 XDR
Representation)
Biểu diễn dữ liệu ngoài
1
Nội dung
2
Truyền tham số trong các hệ thống phân
tán
Stubs
Client machine Server machine
Kernel Kernel
3
Biểu diễn dữ liệu trong máy tính
4
Chuyển đổi dữ liệu
5
Implicit vs. Explicit Typing
n Explicit typing: mỗi mảnh dữ liệu chứa thông
tin về kiểu dữ liệu .
n Implicit typing: Bên gửi và bên nhận phải
đồng ý về thứ tự và kiểu của tất cả các dữ
liệu.
6
XDR
n XDR cung cấp các dịch vụ tương ứng với tầng trình diễn trong
mô hình OSI.
q Biểu diễn dữ liệu chung
n RFC 1014
Process A Process B
Transport Transport
7
XDR – Nhược điểm
n Dư thừa dữ liệu
q Nhưng không đáng kể
8
Các kiểu dữ liệu XDR
n int n hyper: 64-bit signed binary
n unsigned int integer
n enum n unsigned hyper
n float n structure
n double n fixed array
n string n counted array
n union
n opaque data: unconverted data
9
Các kiểu dữ liệu XDR(2)
(MSB) (LSB)
32 bits
(MSB) (LSB)
32 bits
10
Các hàm thư viện XDR
n Chuyển đổi các mục dữ liệu cục bộ thành dữ liệu XDR và
ngược lại
q Thư viện XDR được xây dựng dựa trên mô hình dòng (stream)
n Quá trình biến đổi dữ liệu cục bộ sang dữ liệu XDR là quá trình đưa
dữ liệu vào dòng XDR
XDR stream
11
Dòng XDR
n Dòng XDR có thể gán vào file, pipe, socket hoặc memory.
n Các mục dữ liệu đơn lẻ được thêm hoặc bớt vào dòng XDR
mỗi lần một phần tử.
n Chuyển đổi các mục dữ liệu cục bộ thành dữ liệu XDR được
gọi là mã hóa
n Chuyển đổi dữ liệu XDR thành các mục dữ liệu cục bộ được
gọi là giải mã
12
Tạo dòng XDR
n void xdrmem_create (XDR *xdrs, char *buf, int
bufsize, enum xdr_op op)
q khởi tạo vùng bộ nhớ cho dòng XDR
q trả về con trỏ trỏ tới dòng XDR tạo ra
n được sử dụng trong các lệnh gọi tiếp theo
q op : XDR_ENCODE, XDR_DECODE or XDR_FREE
#include <rpc/xdr.h>
#define BUFSIZE 4000
XDR *xdrs;
char buf[BUFSIZE];
13
Bộ lọc XDR
n Thư viện XDR chứa tập các bộ lọc thực hiện
các thao tác mã hóa hoặc giải mã
n Mỗi dòng XDR chứa một thuộc tính xác định
thao tác (mã hóa hoặc giải mã) được thực
hiện với bộ lọc
14
Các bộ lọc XDR
15
xdr_int()
Nếu thao tác trên XDR là XDR_ENCODE thì:
int count;
XDR *xstream;
xdr_int(xstream, &count);
sẽ chuyển đổi giá trị của biến count sang biểu diễn số nguyên (big-
endian) trong dòng XDR
16
xdr_int() encode vs. decode
Mã hóa tại bên gửi
int count;
xdr_int(xstream,&count);
17
Các bộ lọc XDR khác
18
xdr_string()
n Hàm chuyển đổi chuỗi ký tự khác so với
các hàm chuyển đổi khác
q Có thêm tham số là kích thước tối đa của
chuỗi ký tự
bool_t xdr_string(
XDR *xdrs,
char *string,
u_int maxsize);
19
Các hàm chuyển đổi dữ liệu kết hợp
20
xdr_array()
n Hàm xdr_array() chuyển đổi kiểu dữ
liệu dạng chuỗi với kích thước khác nhau
q Sử dụng cùng một hàm để mã hóa và giải mã
21
xdr_array prototype
rra y
he a
bool_t xdr_array( o f t
s iz e
t h e
XDR *xdrs, e r t o
o in t c an
char **arrp, a p t ha t
tion l
fu n c i d u a
u_int *sizep, a d i v
e r to d e in
o in t e c o
u_int maxsize, p de / d ts
c o e n
en e le m
u_int elsize, y
arra
xdrproc_t elproc);
22
xdr_array() (cont.)
Source
0 1 2 3
Array
elproc()
Dest.
0 1 2 3
Array
23
Inside xdr_array()
encode/decode the number of
elements in the array
xdr_int(xdrs,&sizep);
xdr_int(xdrs,&elsize);
for (i=0;i<sizep;i++)
elproc(xdrs,arrp+elsize*i);
24
Example
25
struct netuser {
char *nu_machinename; // tên máy
int nu_uid; // UID
u_int nu_glen; // số lượng group
int *nu_gids; // chuỗi các ID của group You can
}; create a XDR
#define NLEN 255 /* machine names < 256 chars */ routine by
#define NGRPS 20 /* user can’t be in > 20 groups */ yourself
bool_t xdr_netuser(XDR *xdrs, struct netuser *nup)
{
return(xdr_string(xdrs, &nup->nu_machinename, NLEN) &&
xdr_int(xdrs, &nup->nu_uid) &&
xdr_int(xdrs, &nup->nu_glen) &&
xdr_array(xdrs, &nup->nu_gids, &nup->nu_glen,
NGRPS, sizeof (int), xdr_int));
}
26
XDR streams, I/O and TCP
27
XDR và RPC
28