客户端存根Vs客户端套接字&服务器存根Vs服务器套接字

时间:2017-12-30 01:42:42

标签: c sockets rpc

背景

  

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

对app-to-app协议感兴趣 - RFC 707描述了联网程序调用的方式。

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

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

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

enter image description here

客户&服务器可以在数据表示方面有所不同(Big endian和Little endian)。外部数据表示(add_xdr.c)是机器独立通信所需的数据抽象。

  1. RPC是一种与机器无关的通信吗?

  2. 在RPC世界中,客户端存根&之间的数据包处理代码是否存在? 服务器存根的行为类似于客户端套接字& 服务器套接字?带有数据结构的通信代码的差异,其中包含程序信息add(i, j)

1 个答案:

答案 0 :(得分:1)

RPC与机器无关,因为32位和64位系统可以通信,它不像不同操作系统之间的纯套接字那样可互操作,因为双方必须就更多细节达成一致。

RPC工作在端点之间的传输上,其中一些甚至不能代表套接字(本地内存作为示例)。

您可以在https://msdn.microsoft.com/en-us/library/windows/desktop/aa373935(v=vs.85).aspx

上阅读有关RPC的信息

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