⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rpclib.c

📁 chord 源码 http://pdos.csail.mit.edu/chord/
💻 C
字号:
#include <arpc.h>#include <chord_types.h>#include <transport_prot.h>#include "rpclib.h"unsigned int rpclib_timeout (15);static int dgram_fd = -1;static ptr<axprt_dgram> dgram_xprt;voiddoRPCcb (xdrproc_t proc, dorpc_res *res, void *out, aclnt_cb cb, clnt_stat err);ptr<aclnt>get_aclnt (str host, unsigned short port){  if (dgram_fd < 0) {    dgram_fd = inetsocket (SOCK_DGRAM);    if (dgram_fd < 0) fatal << "Failed to allocate dgram socket.\n";    dgram_xprt = axprt_dgram::alloc (dgram_fd, sizeof(sockaddr), 230000);    if (!dgram_xprt) fatal << "Failed to allocate dgram_xprt.\n";  }  sockaddr_in saddr;  bzero(&saddr, sizeof(sockaddr_in));  saddr.sin_family = AF_INET;  inet_aton (host.cstr (), &saddr.sin_addr);  saddr.sin_port = htons (port);  ptr<aclnt> c = aclnt::alloc (dgram_xprt, transport_program_1, 			       (sockaddr *)&(saddr));  return c;}voiddoRPC (const chord_node &n, const rpc_program &prog,       int procno, const void *in, void *out, aclnt_cb cb){  ptr<aclnt> c = get_aclnt (n.r.hostname, n.r.port);  if (c == NULL)    fatal << "Couldn't get aclnt for " << n.r.hostname << "\n";    //form the transport RPC  ptr<dorpc_arg> arg = New refcounted<dorpc_arg> ();  //header  struct sockaddr_in saddr;  bzero(&saddr, sizeof (sockaddr_in));  saddr.sin_family = AF_INET;  inet_aton (n.r.hostname.cstr (), &saddr.sin_addr);  arg->dest.machine_order_ipv4_addr = ntohl (saddr.sin_addr.s_addr);  arg->dest.machine_order_port_vnnum = (n.r.port << 16) | n.vnode_num;  //leave coords as random.  bzero (&arg->src, sizeof (arg->src));  arg->progno = prog.progno;  arg->procno = procno;    //marshall the args ourself  xdrproc_t inproc = prog.tbl[procno].xdr_arg;  xdrproc_t outproc = prog.tbl[procno].xdr_res;  assert (outproc);    xdrsuio x (XDR_ENCODE);  if ((!inproc) || (!inproc (x.xdrp (), (void *)in))) {    fatal << "failed to marshall args\n";  } else {    int args_len = x.uio ()->resid ();    arg->args.setsize (args_len);    void *marshalled_args = suio_flatten (x.uio ());    memcpy (arg->args.base (), marshalled_args, args_len);    free (marshalled_args);    dorpc_res *res = New dorpc_res (DORPC_OK);    c->timedcall (rpclib_timeout, TRANSPORTPROC_DORPC, arg, res,		  wrap (&doRPCcb, outproc, res, out, cb));  }}voiddoRPCcb (xdrproc_t proc, dorpc_res *res, void *out, aclnt_cb cb, clnt_stat err){  xdrmem x ((char *)res->resok->results.base (), 	    res->resok->results.size (), XDR_DECODE);  if (err) {    warnx << "doRPC: err = " << err << "\n";  } else if (!proc (x.xdrp (), out)) {    warnx << "failed to unmarshall result\n";    cb (RPC_CANTSEND);    return;  }  cb (err);  delete res;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -