函数指针执行错误
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 browser
和 text editor
程序 运行。它们是不同的程序(或 processes
),并且将具有独立且不同的虚拟地址 space。在您的网络浏览器程序中引用您的文本编辑器 variable/function 的地址 (not in shared memory space
) 没有任何意义,甚至该地址甚至可能不会在您的网络浏览器应用程序中退出。访问这样的地址会导致 Segmentation Fault。
Segmentation fault is a specific kind of error caused by accessing memory that “does not belong to you"
.
您一直在从服务器向客户端发送地址 function
。但是,这两个程序(client
和 server
程序)将具有完全不同且独立的虚拟地址 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;
}
这是我定义的结构....
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 browser
和 text editor
程序 运行。它们是不同的程序(或 processes
),并且将具有独立且不同的虚拟地址 space。在您的网络浏览器程序中引用您的文本编辑器 variable/function 的地址 (not in shared memory space
) 没有任何意义,甚至该地址甚至可能不会在您的网络浏览器应用程序中退出。访问这样的地址会导致 Segmentation Fault。
Segmentation fault is a specific kind of error caused by accessing memory that “does not belong to you"
.
您一直在从服务器向客户端发送地址 function
。但是,这两个程序(client
和 server
程序)将具有完全不同且独立的虚拟地址 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;
}