【发布时间】:2017-03-11 04:08:11
【问题描述】:
这是我定义的结构......
typedef enum
{
TCP = 1,
UDP
}protocol;
typedef enum
{
DLL_Operation = 1,
MT_Operation,
Fork_Operation,
IPC_Operation
}msgc;
struct f
{
int seqNo;
protocol p;
msgc m;
protocol q;
int PayLoadSize;
void (*payload_ptr)();
};
现在正在函数指针中获取函数的地址并将其从服务器发送到客户端...
这是我的服务器端代码..
struct f f2;
if(f2.m == 1)
{
f2.payload_ptr = &DLL;
f2.payload_ptr();
}
else if(f2.m == 2)
{
f2.payload_ptr = &MT;
f2.payload_ptr();
}
else if(f2.m == 3)
{
f2.payload_ptr = &Fork;
f2.payload_ptr();
}
else
{
f2.payload_ptr = &IPC;
f2.payload_ptr();
}
printf("Address is: %d\n",f2.payload_ptr);
if(f2.q == 1)
{
if(write(newsockfd, &f2, sizeof(f2)) < 0)
{
printf("\nERROR writing to socket");
exit(0);
}
close(sockfd);
close(newsockfd);
}
这是我用于接收的客户端代码..
struct f f1;
if(f1.q = 1)
{
/* Reading data sent by server */
n = read(sockfd, &f1, sizeof(f1));
if(n < 0)
{
printf("\nERROR reading socket");
exit(0);
}
printf("Address is: %d\n",f1.payload_ptr);
f1.payload_ptr();
close(sockfd);
}
现在的问题是当我打印该指针的地址时……它在两边都打印相同……但是当我调用该函数指针来执行时……它给出了分段错误
【问题讨论】:
-
您能尝试创建一个Minimal, Complete, and Verifiable Example 并展示给我们看吗?
DLL是什么?MT是什么?等等。崩溃发生在哪里?请使用调试器在您的代码中找到它。最后,如果你定义了很好的枚举,为什么不使用它们而不是magic numbers? -
所以您将函数的 地址 发送到另一台机器并期望它是有效调用?
-
另一件事,在具有虚拟内存或程序可以重定位的系统上,您确实知道内存地址(即指针)是每个进程。向其他进程发送指针不会很好地工作。
-
您是否正在寻找某种方式来做RPC (Remote Procedure Call)?那么这不是这样做的方法。使用现有的 RPC 框架。
-
这可能是XY Problem。
标签: c function pointers structure void-pointers