点击确定。然后右键项目选择新建项。
再次选择新建项,选中C++文件,将其改为MySocketClient.c,然后选择添加。
到这里,新建工程就完成了。
然后右键项目,选择属性将配置类型改为动态库(.dll)
#ifndef_INC_MYSOCKETCLIENT_H_
#define_INC_MYSOCKETCLIENT_H_
#defineImport_SSS
#ifdefImport_SSS
#defineAPI_declspec(dllexport)
#else
#defineAPI_declspec(dllimport)
#endif
#ifdef_cplusplus//extern"C"来告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们。
extern"C"{
#endif//_cplusplus
API//导出函数,让外界调用。
intsocketClient_Init(void**handle);
API
intsocketClient_Send(void*handle,unsignedchar*buf,intbuflen);
intsocketClient_Recv(void*handle,unsignedchar*buf,int*buflen);
intsocketClient_Destory(void*handle);
#ifdef_cplusplus
}
#endif//_INC_MYSOCKETCLIENT_H_
#define_CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include"MySocketClient.h"
typedefstruct_Sck_Handle
{
charversion[16];
charip[16];
intport;
unsignedchar*p;
intlen;
}Sck_Handle;//定义Handle的结构体。
intsocketClient_Init(void**handle)
intret=0;
Sck_Handle*tmpHandle=NULL;
if(handle==NULL)
ret=-1;
printf("[socketClient_Init]err%dhandle=NULL\n",ret);
returnret;
tmpHandle=(Sck_Handle*)malloc(sizeof(Sck_Handle));
if(tmpHandle==NULL)
ret=-2;
printf("[socketClient_Init]err:%dmallocerr\n",ret);
memset(tmpHandle,0,sizeof(Sck_Handle));//初始化结构体。
strcpy(tmpHandle->version,"1.0.0.1");
strcpy(tmpHandle->ip,"192.168.12.121");
tmpHandle->port=11111;
*handle=tmpHandle;
socket报文发送
//__declspec(dllexport)
intsocketClient_Send(void*handle,unsignedchar*buf,intbuflen)
if(handle==NULL||buf==NULL||buflen<=0)
printf("funcsocketclient_send()err:%d(handle==NULL||buf==NULL||buflen<=0)\n",ret);
tmpHandle=(Sck_Handle*)handle;
tmpHandle->len=buflen;
tmpHandle->p=(unsignedchar*)malloc(buflen);
if(tmpHandle->p==NULL)
printf("funcsocketclient_send()err:%dmalloclen:%d\n",ret,buflen);
memcpy(tmpHandle->p,buf,buflen);//数据的缓存到内存
printf("接收到发送数据是%s\n",tmpHandle->p);
socket报文接受
intsocketClient_Recv(void*handle,unsignedchar*buf,int*buflen)
if(handle==NULL||buf==NULL||buflen==NULL)
printf("funcsocketclient_recv()err:%d(handle==NULL||buf==NULL||buflen==NULL)\n",ret);
memcpy(buf,tmpHandle->p,tmpHandle->len);
*buflen=tmpHandle->len;//间接赋值告诉调用者收到的数据的长度
printf("数据长度是%d\n",tmpHandle->len);
socket环境释放
intsocketClient_Destory(void*handle)
return-1;
if(tmpHandle->p!=NULL)
free(tmpHandle->p);//释放结构体成员域的指针所指向的内存空间
free(tmpHandle);//释放结构体内存
return0;
然后右键编译工程。在Debug文件夹下面就可以看到生成的dll
新建C++控制台应用程序
新建完成后,将编译好的dll文件、lib文件和h文件放到工程下面。
右键项目属性,将字符集改为使用多字节字符集。
下面是调用dll的代码。
#include
#include
usingnamespacestd;
//定义指针函数
typedefint(*SOCLETCLIENT_INIT)(void**handle);
typedefint(*SOCKETCLIENT_SEND)(void*handle,unsignedchar*buf,intbuflen);
typedefint(*SOCKETCLIENT_RECV)(void*handle,unsignedchar*buf,int*buflen);
typedefint(*SOCKETCLIENT_DESTORY)(void*handle);
intmain()
HINSTANCEhInstance;
hInstance=LoadLibrary("MySocketClient.dll");
SOCLETCLIENT_INITsocketClient_Init=(SOCLETCLIENT_INIT)GetProcAddress(hInstance,"socketClient_Init");
SOCKETCLIENT_SENDsocketClient_Send=(SOCKETCLIENT_SEND)GetProcAddress(hInstance,"socketClient_Send");;
SOCKETCLIENT_RECVsocketClient_Recv=(SOCKETCLIENT_RECV)GetProcAddress(hInstance,"socketClient_Recv");;
SOCKETCLIENT_DESTORYsocketClient_Destory=(SOCKETCLIENT_DESTORY)GetProcAddress(hInstance,"socketClient_Destory");;
unsignedcharbuf[1024];
intbuflen;
unsignedcharout[1024];
intoutlen;
void*handle=NULL;
strcpy((char*)buf,"aaaaAAAAAFFffffffdddddddd");
buflen=9;
//客户端初始化获取handle上下
ret=socketClient_Init(&handle/*out*/);
if(ret!=0)
printf("funcsocketclient_init()err:%d\n",ret);
gotoEnd;
//客户端发报文
ret=socketClient_Send(handle/*in*/,buf/*in*/,buflen/*in*/);
printf("funcsocketclient_send()err:%d\n",ret);
//客户端收报文
ret=socketClient_Recv(handle/*in*/,out/*in*/,&outlen/*inout*/);
printf("funcsocketclient_recv()err:%d\n",ret);
printf("接收到的数据长度是%d\n",outlen);
End:
//客户端释放资源
ret=socketClient_Destory(handle/*in*/);
if(hInstance!=NULL)
FreeLibrary(hInstance);
hInstance=NULL;
printf("hello...\n");
system("pause");
原文链接:wanghao.blog.csdn.net/article/details/108509577
华为开发者空间发布
让每位开发者拥有一台云主机
在此一键设置昵称,即可参与社区互动!
*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。