内核级rpcbind客户端:支持2/3/4版本协议

版权申诉
0 下载量 153 浏览量 更新于2024-10-11 收藏 7KB RAR 举报
资源摘要信息:"RPCB_CLNT.RAR是关于rpcbind客户端的内核支持文件,它支持版本2、3和4的rpcbind协议。" 知识点一:RPCB_CLNT.RAR文件 RPCB_CLNT.RAR文件是一个压缩文件,其中包含了一个名为rpcb_clnt.c的源代码文件。这个文件可能是用于构建一个rpcbind客户端程序的关键部分。 知识点二:rpcb_clnt.c文件 rpcb_clnt.c文件是源代码文件,它包含实现rpcbind客户端功能的代码。这个文件可能是用C语言编写的,因为C语言在系统编程和内核模块开发中广泛使用。 知识点三:rpcbind客户端 rpcbind客户端是一个软件组件,它的主要作用是在网络环境中将远程过程调用(RPC)程序号映射到网络地址。这个过程通常被称为端口映射。有了rpcbind客户端,客户端程序可以通过一个通用的端口访问网络上的服务。 知识点四:rpcbind协议 rpcbind协议是一个在Unix和类Unix系统中广泛使用的服务,它允许一个客户端查找并连接到一个网络服务。这个协议原名portmap,后更名为rpcbind。它支持多个版本,本文件中的rpcbind客户端支持版本2、3和4。 知识点五:RPC协议 远程过程调用(RPC)是一种计算机通信协议。该协议允许一台计算机上的程序调用另一台计算机上的程序,而开发者无需显式地编写创建网络连接的代码。RPC使用了多种传输协议,包括UDP和TCP。版本2、3和4的rpcbind协议都支持RPC。 知识点六:内核模块 文件标题中的"In-kernel"表明这个rpcbind客户端是一个内核模块。内核模块是Linux内核的一种可加载模块,它可以动态地添加到内核中,或者从内核中移除,而无需重启系统。内核模块的功能包括文件系统、设备驱动程序、网络协议等。 知识点七:支持的版本 本文件支持的rpcbind协议版本包括2、3和4。这意味着这个客户端可以与运行这些版本rpcbind服务的服务器进行通信。每个版本的rpcbind都有其特定的功能和改进,了解这些差异对于开发和维护兼容的RPC应用程序很重要。 知识点八:rpcbind服务 rpcbind服务是一个守护进程,用于管理RPC服务的端口号分配。当RPC服务启动时,它会通知rpcbind它正在监听的端口,然后rpcbind会记录下这个映射关系。当客户端请求访问该服务时,rpcbind会返回正确的端口号,使得客户端能够连接到RPC服务。 知识点九:网络服务与客户端 在客户端/服务器模型中,网络服务是指在网络上提供某种功能或数据的程序,而客户端是指使用这些服务的程序。通常,客户端通过发送请求来使用网络服务,服务处理这些请求并返回响应。 知识点十:编程接口 rpcbind客户端的功能需要依赖底层编程接口。在Unix和类Unix系统中,RPC服务通过SunRPC(Sun Remote Procedure Call)或ONC RPC(Open Network Computing Remote Procedure Call)库与程序通信。这些库为程序员提供了与RPC服务交互的APIs(应用程序编程接口)。 通过上述知识点的介绍,我们可以了解到RPCB_CLNT.RAR文件是一个用于构建RPC协议版本2、3和4支持的内核级别rpcbind客户端的压缩包。它涉及到了网络编程、内核模块开发、服务与客户端交互等多个方面的深入知识。

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define BUF_SIZE 1024 #define OPSZ 4 void error_handling(char message); int calculate(int opnum, int opnds[], char oprator); int main(int argc, char argv[]) { int serv_sock, clnt_sock; char opinfo[BUF_SIZE]; int result, opnd_cnt, i; int recv_cnt, recv_len; struct sockaddr_in serv_adr, clnt_adr; socklen_t clnt_adr_sz; if(argc!=2) { printf("Usage : %s <port>\n", argv[0]); exit(1); } serv_sock=socket(PF_INET, SOCK_STREAM, 0); if(serv_sock==-1) error_handling("socket() error"); memset(&serv_adr, 0, sizeof(serv_adr)); serv_adr.sin_family=AF_INET; serv_adr.sin_addr.s_addr=htonl(INADDR_ANY); serv_adr.sin_port=htons(atoi(argv[1])); if(bind(serv_sock, (struct sockaddr)&serv_adr, sizeof(serv_adr))==-1) error_handling("bind() error"); if(listen(serv_sock, 5)==-1) error_handling("listen() error"); clnt_adr_sz=sizeof(clnt_adr); for(i=0; i<5; i++) { opnd_cnt=0; clnt_sock=accept(serv_sock, (struct sockaddr)&clnt_adr, &clnt_adr_sz); read(clnt_sock, &opnd_cnt, 1); recv_len=0; while((opnd_cntOPSZ+1)>recv_len) { recv_cnt=read(clnt_sock, &opinfo[recv_len], BUF_SIZE-1); recv_len+=recv_cnt; } result=calculate(opnd_cnt, (int)opinfo, opinfo[recv_len-1]); write(clnt_sock, (char*)&result, sizeof(result)); close(clnt_sock); } close(serv_sock); return 0; } int calculate(int opnum, int opnds[], char op) { int result=opnds[0], i; switch(op) { case '+': for(i=1; i<opnum; i++) result+=opnds[i]; break; case '-': for(i=1; i<opnum; i++) result-=opnds[i]; break; case '': for(i=1; i<opnum; i++) result=opnds[i]; break; } return result; } void error_handling(char *message) { fputs(message, stderr); fputc('\n', stderr); exit(1); } 对每行代码给出详细解释

2023-06-10 上传

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define BUF_SIZE 1024 #define OPSZ 4 void error_handling(char *message); int calculate(int opnum, int opnds[], char oprator); int main(int argc, char *argv[]) { int serv_sock, clnt_sock; char opinfo[BUF_SIZE]; int result, opnd_cnt, i; int recv_cnt, recv_len; struct sockaddr_in serv_adr, clnt_adr; socklen_t clnt_adr_sz; if(argc!=2) { printf("Usage : %s <port>\n", argv[0]); exit(1); } serv_sock=socket(PF_INET, SOCK_STREAM, 0); if(serv_sock==-1) error_handling("socket() error"); memset(&serv_adr, 0, sizeof(serv_adr)); serv_adr.sin_family=AF_INET; serv_adr.sin_addr.s_addr=htonl(INADDR_ANY); serv_adr.sin_port=htons(atoi(argv[1])); if(bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1) error_handling("bind() error"); if(listen(serv_sock, 5)==-1) error_handling("listen() error"); clnt_adr_sz=sizeof(clnt_adr); for(i=0; i<5; i++) { opnd_cnt=0; clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz); read(clnt_sock, &opnd_cnt, 1); recv_len=0; while((opnd_cnt*OPSZ+1)>recv_len) { recv_cnt=read(clnt_sock, &opinfo[recv_len], BUF_SIZE-1); recv_len+=recv_cnt; } result=calculate(opnd_cnt, (int*)opinfo, opinfo[recv_len-1]); write(clnt_sock, (char*)&result, sizeof(result)); close(clnt_sock); } close(serv_sock); return 0; } int calculate(int opnum, int opnds[], char op) { int result=opnds[0], i; switch(op) { case '+': for(i=1; i<opnum; i++) result+=opnds[i]; break; case '-': for(i=1; i<opnum; i++) result-=opnds[i]; break; case '*': for(i=1; i<opnum; i++) result*=opnds[i]; break; } return result; } void error_handling(char *message) { fputs(message, stderr); fputc('\n', stderr); exit(1); } 对每行代码进行解释

2023-06-10 上传