C 客户端存根与客户端套接字&;服务器存根与服务器套接字 出身背景
TCP/IP上的任何客户端套接字程序(C)看起来像C 客户端存根与客户端套接字&;服务器存根与服务器套接字 出身背景,c,sockets,rpc,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(&ser
/* 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.
*
*/
/* 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.
*
*/
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.
*
*/
/* 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:1971年电子邮件、FTP和可互操作的Telnet:1973 人们对app-to-app协议(RFC 707)感兴趣,RFC 707描述了网络过程调用的完成方式 RPC是在ansi C world(比如)中,通过libnsl.so.1将数据结构从客户端存根传输到服务器端存根的过程。数据结构 可以保存添加操作的消息(例如),如下所示
-------------
| proc: "add" |
-------------
| int: val(i) |
-------------
| int: val(j) |
-------------
远程
添加(i,j)
操作的RPC的典型流程
客户机和服务器的数据表示形式可能不同(大端和小端)。外部数据表示(addxdr.c
)是独立于机器的通信所需的数据抽象
add(i,j)
RPC是独立于机器的,因为32位和64位系统可以通信,它不像不同操作系统之间的纯套接字那样具有互操作性,因为双方必须在更多细节上达成一致 RPC通过端点之间的传输工作,其中一些甚至不能表示为套接字(例如,本地内存) 您可以在
RPC代码看起来确实与套接字代码大不相同,因为调用代码中的RPC与任何其他函数一样,它只存在于那些函数中(通常是工具生成的)将数据绑定以进行传输的函数。客户端和服务器存根之间的数据包处理代码是否类似于客户端套接字和服务器套接字?RPC是一个通用术语,它包含从Sun RPC开始的几项内容(如果不是以前的话)。一般来说,RPC是一个远程过程调用,包含可能大量的原语或结构作为参数的传输、调用本身以及原语或结构作为返回值的返回。不是你上面说的。我从未见过RFC707的实际实现。