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

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这个函数需要参数,怎么把参数传进去呢?

蓝山帝景
浏览 302回答 2
2回答

噜噜哒

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

犯罪嫌疑人X

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);}结构体初始化用=有什么问题吗?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python
Java