簡體   English   中英

如何通過C中的套接字發送和接收內存地址?

[英]How to send and receive memory addresses via a socket in C?

我想通過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位系統也應該適用於32位;)此外,代碼應使用-Wall -Werror進行編譯。

感謝您的幫助! 喬納斯,周末愉快

要回答您的問題,您可以簡單地通過再次復制將原始數據轉換回指針:

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);

這將創建一個固定長度的字符串,可以在遠程主機上進行處理。 這樣做的好處是它不需要接收主機知道發送主機的指針大小和格式的詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM