这是我定义的结构。
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);
}
现在的问题是,当我打印该指针的地址时...在两面都打印相同....但是当我调用该函数指针执行...时,它给出了分段错误
似乎您一直在尝试执行Remote Procedure Call。而且您做错了。让我们从Remote Procedure Call
定义开始。
在分布式计算中,远程过程调用(RPC)是指计算机程序使一个过程(子例程)在另一个
address space
(通常是在共享网络上的另一台计算机上)执行时,其编码方式就像是正常的(本地)过程调用一样。 ,而无需程序员为远程交互明确编码细节。
就像提到的那样,在RPC中,计算机程序在不同的地址空间中执行过程。program
即使两个进程(或)在同一台计算机上运行,它们也可以具有不同的地址空间。
例如,考虑web browser
并text editor
在您的计算机上运行的程序。它们是不同的程序(或processes
),并且将具有独立且不同的虚拟地址空间。not in shared memory space
在网络浏览器程序中引用文本编辑器的变量/函数的地址()没有任何意义,甚至该地址甚至都不会在您的网络浏览器应用程序中退出。访问这样的地址可能会导致分段错误。Segmentation fault is a specific kind of error caused by accessing memory that “does not belong to you"
。
您一直在function
从服务器向客户端发送地址。但是,这两个程序(client
和server
程序)将具有完全不同且独立的虚拟地址空间。process
即使在两个程序中定义了相同的功能,一个程序(或)中具有特定地址的功能在第二程序中也将具有不同的地址。两个不同进程之间的函数的虚拟地址空间映射之间不会有任何关系。
但是,如果您尝试这样做,我可能会解决您的问题Remote Procedure Call
。您可以在服务器程序和客户端程序之间转换字符串。该字符串应指定要远程执行的函数的名称。您可以比较接收到的字符串以找出要调用的函数。
服务器端程序:
#include <stdio.h>
#define TO_STR(x) #x
void func1()
{
printf("func1\n");
}
void func2()
{
printf("func2\n");
}
int main()
{
sendFunctionName(TO_STR(func1));
return 0;
}
客户端程序:
#include <stdio.h>
#define TO_STR(x) #x
void func1()
{
printf("func1\n");
}
void func2()
{
printf("func2\n");
}
int main()
{
char functionName[1000];
if (receiveFunctionName(functionName) < 0)
return -1;
if (!strcmp(functionName, TO_STR(func1)))
func1();
else if (!strcmp(functionName, TO_STR(func2)))
func2();
else
printf("Undefined Function\n");
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句