#include "stdlib.h"
#include "stdio.h"
#include "string.h"

typedef struct _SCK_HANDLE {
    char    version[16];
    char    serverip[16];
    int     serverport;
    char    *pBuf;
    int     buflen ;
}SCK_HANDLE;

//------------------第一套api接口---Begin-------------------//
//客户端初始化 获取handle上下
 __declspec(dllexport)
int cltSocketInit(void **handle /*out*/)
{
    int ret = 0;
    SCK_HANDLE *sh = NULL;
    sh = (SCK_HANDLE *)malloc(sizeof(SCK_HANDLE));
    if (sh == NULL)
    {
        ret = -1;
        printf("func cltSocketInit() err:%d", ret);
        return ret;
    }
    strcpy(sh->version, "1.0.0");
    strcpy(sh->serverip, "192.168.0.100");
    sh->serverport = 8080;

    *handle = sh;

    return ret;
}

//客户端发报文
__declspec(dllexport)
int cltSocketSend(void *handle /*in*/, unsigned char *buf /*in*/,  int buflen /*in*/)
{
    int ret = 0;
    SCK_HANDLE *sh = NULL;
    if (handle == NULL || buf==NULL || buflen>3323214324)
    {
        ret = -1;
        printf("func cltSocketSend() err:%d", ret);
        return ret;
    }
    sh = (SCK_HANDLE *)handle;

    sh->pBuf = (char *)malloc(buflen * sizeof(char));
    if (sh->pBuf == NULL)
    {
        ret = -2;
        printf("func cltSocketSend() malloc err, buflen:%d", buflen);
        return ret;
    }
    memcpy(sh->pBuf, buf, buflen);
    sh->buflen = buflen;

    return ret;
}

//客户端收报文
__declspec(dllexport)
int cltSocketRev(void *handle /*in*/, unsigned char *buf /*in*/, int *buflen /*in out*/)
{
    int ret = 0;
    SCK_HANDLE *sh = NULL;
    if (handle == NULL || buf==NULL || buflen==NULL)
    {
        ret = -1;
        printf("func cltSocketRev() err:%d", ret);
        return ret;
    }
    sh = (SCK_HANDLE *)handle;

    memcpy(buf, sh->pBuf, sh->buflen);
    *buflen = sh->buflen;

    return ret;
}

//客户端释放资源
__declspec(dllexport)
int cltSocketDestory(void *handle/*in*/)
{
    int ret = 0;
    SCK_HANDLE *sh = NULL;
    if (handle == NULL)
    {
        ret = -1;
        printf("func cltSocketDestory() err:%d", ret);
        return ret;
    }
    sh = (SCK_HANDLE *)handle;

    if (sh->pBuf != NULL)
    {
        free(sh->pBuf);
    }

    free(sh);
    return ret;
}
//------------------第一套api接口---End-------------------------//

//------------------第二套api接口---Begin--------------------------------//
__declspec(dllexport)
int cltSocketInit2(void **handle)
{
    return cltSocketInit(handle);
}

//客户端发报文
__declspec(dllexport)
int cltSocketSend2(void *handle, unsigned char *buf,  int buflen)
{
    return cltSocketSend(handle, buf, buflen);
}
//客户端收报文
__declspec(dllexport)
int cltSocketRev2(void *handle, unsigned char **buf, int *buflen)
{
    int ret = 0;
    SCK_HANDLE *sh = NULL;
    unsigned char *tmp = NULL;
    if (handle == NULL || buf==NULL || buflen==NULL)
    {
        ret = -1;
        return ret;
    }
    sh = (SCK_HANDLE *)handle;

    tmp = (unsigned char *)malloc(sh->buflen * sizeof(unsigned char));
    if (tmp == NULL)
    {
        ret = -1;
        return ret;
    }
    memcpy(tmp, sh->pBuf, sh->buflen);

    //赋值
    *buf = tmp;
    *buflen = sh->buflen;
    return ret;
}
__declspec(dllexport)
int cltSocketRev2_Free(unsigned char **buf)
{
    int ret = 0;
    if (buf == NULL)
    {
        ret = -1;
        return ret;
    }
    free(*buf);
    *buf = NULL; //间接的把实参给修改了
    return ret;
}
//客户端释放资源
__declspec(dllexport)
int cltSocketDestory2(void **handle)
{
    int ret = 0;
    SCK_HANDLE *sh = NULL;
    if (handle == NULL)
    {
        ret = -1;
        return ret;
    }

    sh = (SCK_HANDLE *) *handle;

    if (sh->pBuf != NULL)
    {
        free(sh->pBuf);
    }

    free(sh);
    *handle = NULL; //间接修改实参的值 避免野指针
    return ret;
}
//------------------第二套api接口---End--------------------------------//


备份地址: 【Dll数据封装