函数指针执行错误

Error in function pointer execution

这是我定义的结构....

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 定义开始。

In distributed computing a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in another address space (commonly on another computer on a shared network), which is coded as if it were a normal (local) procedure call, without the programmer explicitly coding the details for the remote interaction.

正如提到的,在 RPC 中,计算机程序在不同的地址 space 中执行一个过程。两个进程(或 program)可以有不同的地址 space,即使它们在同一台机器上 运行。

例如,考虑计算机中的 web browsertext editor 程序 运行。它们是不同的程序(或 processes),并且将具有独立且不同的虚拟地址 space。在您的网络浏览器程序中引用您的文本编辑器 variable/function 的地址 (not in shared memory space) 没有任何意义,甚至该地址甚至可能不会在您的网络浏览器应用程序中退出。访问这样的地址会导致 Segmentation FaultSegmentation fault is a specific kind of error caused by accessing memory that “does not belong to you".

您一直在从服务器向客户端发送地址 function。但是,这两个程序(clientserver 程序)将具有完全不同且独立的虚拟地址 space。在一个程序(或 process)中具有特定地址的函数在第二个程序中将具有不同的地址,即使在两个程序中定义了相同的函数。两个不同进程之间的函数虚拟地址 space 映射之间不会有任何关系。

但是如果您正在尝试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;
}