为了账号安全,请及时绑定邮箱和手机立即绑定

请问在linux ping命令中的struct proto的问题,求解释~

请问在linux ping命令中的struct proto的问题,求解释~

蓝山帝景 2021-12-31 11:07:12
ping命令里定义的struct proto:struct proto {void (*fproc)(char *, ssize_t, struct timeval *);void (*fsend)(void);struct sockaddr *sasend; /* sockaddr{} for send, from getaddrinfo */struct sockaddr *sarecv; /* sockaddr{} for receiving */socklen_t salen; /* length of sockaddr{}s */int icmpproto; /* IPPROTO_xxx value for ICMP */} *pr;有:struct proto proto_v4 = { proc_v4, send_v4, NULL, NULL, 0, IPPROTO_ICMP };其中的proc_v4,send_v4都是函数,pro定义如下:void proc_v4(char *ptr, ssize_t len, struct timeval *tvrecv);void send_v4(void);具体函数内部定义就不贴了,没什么关系。我的问题是:在proto_v4 = { proc_v4, send_v4, NULL, NULL, 0, IPPROTO_ICMP }中,proc_v4函数怎么传参?整个ping源码里面没有其他地方调用到proc_v4了,只有在proto_v4里调用了,他传进去的是函数的是函数地址还是函数返回值的地址?而且struct proto_v4怎么可以直接用‘=‘呢?求高手帮忙解答,谢谢!那还有proc_v4这个函数需要参数,怎么把参数传进去呢?
查看完整描述

2 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

可以使用,相当与函数地址作为一个常量值赋值给结构体变量函数
proto_v4 = { proc_v4, send_v4, NULL, NULL, 0, IPPROTO_ICMP };
等同于:
proto_v4 = { &proc_v4, &send_v4, NULL, NULL, 0, IPPROTO_ICMP }
即取函数地址指针。

查看完整回答
反对 回复 2022-01-04
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

fproc是函数指针,指向函数的入口地址。
标准写法是proto_v4.fproc = &proc_v4;
可以简写为proto_v4.fproc = proc_v4;
编译器都认识。

用函数指针通常可以封装某些内部信息,参数可以通过消息传递。

可能的一种调用形式为:
void process(struct proto *p,u32 msg[4])
{
char *s = (char*)msg[0];
ssize_t *sz = (ssize_t*)msg[1];
struct timeval *tv = (struct timeval*)msg[2];
p->fproc(s,*sz,tv);
}

结构体初始化用=有什么问题吗?



查看完整回答
反对 回复 2022-01-04
  • 2 回答
  • 0 关注
  • 301 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号