如何通过C中的套接字发送和接收内存地址?

如何通过C中的套接字发送和接收内存地址?,c,sockets,void-pointers,memory-address,C,Sockets,Void Pointers,Memory Address,我想通过C中的套接字发送/接收内存地址。 我所拥有的是: void *ptr = malloc(122); /* So the pointer points to some valid address */ unsigned char *socketData = NULL; socketData = (unsigned char*)malloc(sizeof(void*)); memset(socketData, 0, sizeof(void*)); /* ??? How to get th

我想通过C中的套接字发送/接收内存地址。 我所拥有的是:

void *ptr = malloc(122); /* So the pointer points to some valid address */
unsigned char *socketData = NULL;

socketData = (unsigned char*)malloc(sizeof(void*));
memset(socketData, 0, sizeof(void*));

/* ??? How to get the memory address - where ptr points to - to socketData ??? */
我知道使用
printf
打印指针地址的方法是使用
%p
,即

printf("%p", ptr);
但这会打印例如0x0021ef1a。 我想要的是:0021ef1a

在接收方:如何将接收到的字节转换回
void*

啊:代码应该适用于32位系统,也适用于64位系统;) 此外,代码应该使用-Wall-Werror….编译。。。。嗯

谢谢你的帮助! 有一个愉快的周末,
jonas

要回答您的问题,只需再次复制即可将原始数据转换回指针:

void *ptr = malloc(42);
void *ptr2 = NULL;

unsigned char *data = malloc(sizeof(void *));

memcpy(data, &ptr, sizeof(void *));

...

memcpy(&ptr2, data, sizeof(void *));

printf("ptr  = %p\n", ptr);
printf("ptr2 = %p\n", ptr2);
请注意,在大多数情况下,在套接字上发送指针没有什么意义。指针值对于接收方来说是无用的,除非它恰好是与发送方相同的过程。每个进程将有一个单独的虚拟地址空间


给出你提出的申请,我建议在接收方,你应该考虑用一个指针来表示这一点,因为在这种形式中它是没有用的。相反,为什么不将其存储在适当大的整数类型中?

要回答您的问题,只需再次复制即可将原始数据转换回指针:

void *ptr = malloc(42);
void *ptr2 = NULL;

unsigned char *data = malloc(sizeof(void *));

memcpy(data, &ptr, sizeof(void *));

...

memcpy(&ptr2, data, sizeof(void *));

printf("ptr  = %p\n", ptr);
printf("ptr2 = %p\n", ptr2);
请注意,在大多数情况下,在套接字上发送指针没有什么意义。指针值对于接收方来说是无用的,除非它恰好是与发送方相同的过程。每个进程将有一个单独的虚拟地址空间


给出你提出的申请,我建议在接收方,你应该考虑用一个指针来表示这一点,因为在这种形式中它是没有用的。相反,为什么不将其存储在一个适当大的整数类型中?

如果您希望像
printf()
那样格式化指针,将其发送到另一台主机进行显示,那么
sprintf()
可能是正确的方法:

char dest[100] = "";
snprintf(dest, sizeof dest, "%p", ptr);

这将创建一个固定长度的字符串,可以在远程主机上进行处理。这样做的好处是,它不需要接收主机知道发送主机指针大小和格式的详细信息。

如果您希望将指针格式化为
printf()
所做的格式,发送到另一台主机进行显示,那么
sprintf()
可能是正确的方法:

char dest[100] = "";
snprintf(dest, sizeof dest, "%p", ptr);

这将创建一个固定长度的字符串,可以在远程主机上进行处理。这样做的好处是,它不需要接收主机知道发送主机指针大小和格式的详细信息。

我是否正确理解了这一点,是否要将内存地址发送到其他计算机/进程?如果接收进程运行在同一台机器上,我认为它无法访问发送进程分配的内存(除非它们使用某种形式的共享内存)。如果它是一台完全不同的计算机,内存地址是无用的。。。除非用于引用另一端的某些资源,但出于安全考虑,考虑到缓冲区溢出攻击等,我仍然不会使用原始内存地址。我是否正确理解了这一点,您希望将内存地址发送到其他计算机/进程?如果接收进程运行在同一台机器上,我认为它无法访问发送进程分配的内存(除非它们使用某种形式的共享内存)。如果它是一台完全不同的计算机,内存地址是无用的。。。除非用于引用另一端的某些资源,但出于安全考虑,考虑到缓冲区溢出攻击等,我仍然不会使用原始内存地址。如果他想为无法输出到屏幕但可以通过套接字与计算机通信的设备实现内存检查,这是有意义的。嗨,oli&eric,首先感谢您的快速回复。我知道内存地址在接收方是不有用的,也不可用的,因为进程空间是分开的。然而,你知道如何完成这项任务吗@埃里克:这正是我想要实现的。谢谢乔纳斯坦克斯·奥利,就是这样!再次感谢!你让我开心!:)不需要
malloc
<代码>无符号字符数据[sizeof(void*)]可以。@larsmans:确实可以。但是缓冲区是用来表示流入或流出套接字的流的。如果他想为无法输出到屏幕但可以通过套接字与计算机通信的设备实现内存检查,这是有意义的。嗨,oli&eric,首先感谢您的快速回复。我知道内存地址在接收方是不有用的,也不可用的,因为进程空间是分开的。然而,你知道如何完成这项任务吗@埃里克:这正是我想要实现的。谢谢乔纳斯坦克斯·奥利,就是这样!再次感谢!你让我开心!:)不需要
malloc
<代码>无符号字符数据[sizeof(void*)]可以。@larsmans:确实可以。但是缓冲区是用来表示进出套接字的流的。