函数指针执行中的错误

米兰·莎(Milan Shah)

这是我定义的结构。

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 browsertext 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从服务器向客户端发送地址但是,这两个程序(clientserver程序)将具有完全不同且独立的虚拟地址空间。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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++中的函数指针错误

来自分类Dev

如何在Rascal中执行“函数指针”?

来自分类Dev

从C中的函数返回指针错误

来自分类Dev

在成员函数中,错误的函数被“执行”

来自分类Dev

错误编译,函数指针

来自分类Dev

在指针类中引用虚拟函数时出现段错误

来自分类Dev

在向量中访问指针的成员函数时出现分段错误

来自分类Dev

带有指针的C错误中的Malloc函数

来自分类Dev

函数中的指针获取“必须是可修改的左值”错误

来自分类Dev

取消引用调用函数中的指针时出现分段错误

来自分类Dev

使用函数指针推迟函数执行

来自分类Dev

如何捕获函数参数并存储函数指针以供以后在C ++ 11中执行?

来自分类Dev

指向函数中向量的向量的指针给出“表达式必须具有指针类型”错误

来自分类Dev

指向函数错误的指针

来自分类Dev

函数指针编译错误

来自分类Dev

结构函数指针错误

来自分类Dev

成员模板函数指针错误

来自分类Dev

更新函数中的指针

来自分类Dev

C ++中的函数指针

来自分类Dev

了解函数中的指针

来自分类Dev

C ++中的指针错误

来自分类Dev

传递给构造函数的函数指针的赋值中的类型转换错误

来自分类Dev

指针侦探-检查对象(实例)并执行“ PointerDetective openOn:self”。导致Pharo中的系统错误?

来自分类Dev

指向Swift函数中的指针参数的指针

来自分类Dev

如何从函数中获取指针的指针

来自分类Dev

指向C ++中的函数指针的指针

来自分类Dev

没有参数中的指针的函数指针

来自分类Dev

函数参数中的void指针

来自分类Dev

c中的指针和函数