要使用基于C的套接字服务器框架,我们需要在基于C的程序的套接字服务器线程和基于C ++的DLL之间传输数据。 操作系统MacO。
在DLL中,一切正常,我们能够管理OCR核心和数据库。 在套接字服务器内部,一切正常,并且经过几年的测试,ESP框架已经成熟 embedthis.com/esp/
借助Stackoverflow社区,我们开发了工作解决方案。 现在正在工作的用于将分配的内存缓冲区从DLL传输到主程序的代码是:
//in library header
typedef
struct pageRecord{
char *data;
}pageRec;
// in library function
extern "C"{
EXPORT
pageRec helloVarStr(void) {
//c++ content
string stData="www ....";
pageRec rec;
rec.data=(char*)calloc(stData.size()+1,1);
memcpy(rec.data,&stData[0],stData.size());
return rec;
}
}
//in socket server thread
pageRec c=helloVarStr();
printf("%s",c.data);
此代码工作正常,并在结构内部使用了指针。 但是,如果我们尝试仅使用指针本身,则会在C程序中出现内存错误
此代码执行上升内存错误:
EXPORT
const char* helloVarStr() {
//c++ content
char *str=(char*)calloc(stData.size()+1, 1);
string stData="www....";
memcpy(str,(char*)&stData[0],stData.size());
return str;
}
//in C language ESP socket server
char *report=helloVarStr(&report);
printf("%s",report); //!// memory error
我们不能在分配的缓冲区上使用直接指针作为从库函数返回的函数。 静态和动态链接都存在此问题。
为什么我们可以在结构体中使用指针作为库函数返回,但不能使用指针本身呢? 这是否意味着DLL使用了我们无法直接访问的另一个内存地址空间?
此解决方案需要6Tb,每秒1个请求的套接字服务器站点。