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. * */
早期的主机到主机协议专注于人机对话通信Ex:Email 1971,FTP和可互操作的Telnet:1973
对app-to-app协议感兴趣 - RFC 707描述了联网过程调用的完成方式。
RPC是在ansi C世界中通过libnsl.so.1
将数据结构从客户端存根转移到服务器端存根(比方说)。数据结构可以保存添加操作的消息(比如说),如下所示,
-------------
| proc: "add" |
-------------
| int: val(i) |
-------------
| int: val(j) |
-------------
用于远程add(i, j)
操作的RPC的典型流程,
客户端和服务器的数据表示可能不同(Big endian和Little endian)。外部数据表示(add_xdr.c
)是机器独立通信所需的数据抽象。
add(i, j)
的数据结构的通信代码的差异RPC与机器无关,因为32位和64位系统可以通信,它不像不同操作系统之间的纯套接字那样可互操作,因为双方必须就更多细节达成一致。
RPC工作在端点之间的传输上,其中一些甚至不能代表套接字(本地内存作为示例)。
您可以在https://msdn.microsoft.com/en-us/library/windows/desktop/aa373935(v=vs.85).aspx上阅读有关RPC的信息
RPC代码看起来与套接字代码完全不同,因为调用代码中的RPC看起来像任何其他函数,它只是在那些(通常是工具生成的)函数中捆绑数据进行传输。