Клиентская заглушка против клиентского сокета и серверная заглушка против серверного сокета

Задний план

Любая программа клиентских сокетов (C) через TCP/IP выглядит так:

 /* 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.
    *
    */

Любая программа серверных сокетов (C) через TCP/IP выглядит так:

  /* 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) |
 -------------

Типичный поток RPC для удаленной add(i, j) операции,

введите здесь описание изображения

Клиент и сервер могут различаться представлениями данных (с прямым порядком байтов и с прямым порядком байтов). Представление внешних данных (add_xdr.c) — это абстракция данных, необходимая для машинно-независимой связи.


  1. Является ли RPC независимой от машины связью?

  2. В мире RPC код обработки пакетов между клиентской заглушкой и серверной заглушкой ведет себя аналогично клиентскому сокету и серверному сокету ? с разницей в коммуникационном коде, несущем структуру данных, содержащую информацию о процедуре add(i, j)


person overexchange    schedule 30.12.2017    source источник
comment
RPC — это общий термин, который охватывает несколько вещей, начиная с Sun-RPC, если не раньше. В общем случае RPC представляет собой удаленный вызов процедуры, включающий в себя передачу, возможно, большого количества примитивов или структур в качестве параметров, сам вызов и возврат примитива или структуры в качестве параметров. возвращаемое значение. Не то, что вы сказали выше. И я никогда не видел реальной реализации RFC 707.   -  person user207421    schedule 30.12.2017


Ответы (1)


RPC не зависит от машины, поскольку 32-разрядные и 64-разрядные системы могут взаимодействовать, он не так совместим, как чистые сокеты между различными ОС, поскольку обе стороны должны согласовать гораздо больше деталей.

RPC работает с транспортами между конечными точками, некоторые из которых даже не могут быть представлены в виде сокетов (например, локальная память).

Вы можете прочитать о RPC по адресу https://msdn.microsoft.com/en-us/library/windows/desktop/aa373935(v=vs.85).aspx

Код RPC сильно отличается от кода сокета тем, что RPC в вызывающем коде выглядят как любая другая функция, только в тех функциях (обычно сгенерированных инструментами) данные объединяются для транспортировки.

person SoronelHaetir    schedule 30.12.2017
comment
Код обработки пакетов между клиентом и сервером похож на клиентский сокет и серверный сокет? - person overexchange; 30.12.2017