【问题标题】:Client stub Vs Client socket & Server stub Vs Server socket客户端存根与客户端套接字和服务器存根与服务器套接字
【发布时间】:2018-06-10 08:12:36
【问题描述】:

背景

任何基于 TCP/IP 的客户端套接字程序 (C) 看起来像,

 /* Socket creation */
 sockfd = socket(AF_INET, SOCK_STREAM, 0);

 /* Do nothing for dynamic address assignment to that client socket */

 /* Identify the server, we use to send a request for connection */
   bzero(&servaddr, sizeof(servaddr));
   servaddr.sin_family = AF_INET;
   servaddr.sin_port = htons(8000);
   inet_pton(AF_INET, serv_ip, &servaddr.sin_addr);

 /* Connect request to listening socket of server */ 
   ret_val = connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));

 /* 
    *
       Communication code
       ================== 
       Here comes the code for application layer protocol using read() & write() call that follow FTP, HTTP, SMTP specific rules.
    *
    */

任何基于 TCP/IP 的服务器套接字程序 (C) 看起来像,

  /* Create listen socket */
    listfd = socket(AF_INET, SOCK_STREAM, 0);


  /* Assign protocol family(AF_INET) & address to that socket */
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(8004);
    retval = bind(listfd, (struct sockaddr *) &servaddr, sizeof(servaddr));

  /* Enable the communication on that socket */
    listen(listfd, 5);

  /* with a specific server model(iterative/threaded/multiprocess/..) accept 
 client request */
     connfd = accept(listfd, (struct sockaddr *) &cliaddr, &clilen);

  /* 
     *
       Communication code
       ==================
       Here comes the code for application layer protocol using read() & write() call that follow FTP, HTTP, SMTP specific rules.
     *
     */

早期的主机到主机协议专注于人机通信 例如:电子邮件 1971、FTP 和可互操作的 Telnet:1973

人们对应用到应用协议感兴趣 - RFC 707 描述了完成网络过程调用的方式。

RPC 是 数据结构 通过libnsl.so.1 从客户端存根到服务器端存根的传输,在 ansi C 世界中(比如说)。数据结构 可以保存一个添加操作的消息(比如),如下图,

 -------------
| proc: "add" |
 -------------
| int: val(i) |
 -------------
| int: val(j) |
 -------------

远程add(i, j)操作的典型RPC流程,

客户端和服务器在数据表示上可能不同(大端和小端)。外部数据表示 (add_xdr.c) 是机器独立通信所需的数据抽象。


  1. RPC 是独立于机器的通信吗?

  2. 在 RPC 世界中,client stubserver stub 之间的数据包处理代码的行为是否类似于 client socket服务器套接字?不同之处在于通信代码携带一个数据结构,其中包含过程信息add(i, j)

【问题讨论】:

  • RPC 是一个通用术语,它涵盖了从 Sun-RPC 开始的几件事,如果不是之前的话。一般来说,RPC 是一个远程 过程调用, 包括传输可能大量的原语或结构作为参数、调用本身以及原语或结构作为参数的返回返回值。不是你上面说的。而且我从未见过 RFC 707 的实际实现。

标签: c sockets rpc


【解决方案1】:

RPC 是独立于机器的,因为 32 位和 64 位系统可以通信,它不像不同操作系统之间的纯套接字那样具有互操作性,因为双方必须在更多细节上达成一致。

RPC 处理端点之间的传输,其中一些甚至不能表示为套接字(例如本地内存)。

您可以在https://msdn.microsoft.com/en-us/library/windows/desktop/aa373935(v=vs.85).aspx 阅读有关 RPC 的信息

RPC 代码看起来确实与套接字代码有很大不同,因为调用代码中的 RPC 看起来像任何其他函数,只是在那些(通常是工具生成的)函数中捆绑了数据以进行传输。

【讨论】:

  • 客户端和服务器存根之间的数据包处理代码看起来类似于客户端套接字和服务器套接字吗?
猜你喜欢
  • 2011-11-15
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多