admin 发表于 2015-5-21 21:06:09

2015-05-21 客户端SDK开放网络数据发送回调接口

AnyChat新版本(r4608)开放了客户端的流媒体数据发送回调接口,通过该接口AnyChat内核将底层网络数据包回调给上层应用,由上层应用自主实现数据的发送过程。特别是一些对网络发包间隔有严格要求的网络环境下,由上层应用自定义数据包的发送是较好的一种解决方案。

新增回调函数:
// 网络数据发送回调函数定义
typedef DWORD (CALLBACK * BRAC_NetworkDataSend_CallBack)(DWORD hSocket, DWORD dwFlags, CHAR* lpBuf, DWORD dwSize, DWORD dwTargetAddr, DWORD dwTargetPort, LPVOID lpUserValue);示例代码:
/**
*        网络数据发送回调函数定义
*        @param hSocket 用于发送数据的Socket句柄
*        @param dwFalgs 标识,备用
*        @param lpBuf 数据缓冲区
*        @param dwSize 缓冲区大小
*        @param dwTargetAddr 目标IP地址,主机字节序
*        @param dwTargetPort 目标端口,主机字节序
*        @return 返回实际发送成功的字节数,若失败则返回-1
*/
DWORD CALLBACK OnAnyChatNetworkDataSendCallBack(DWORD hSocket, DWORD dwFlags, CHAR* lpBuf, DWORD dwSize, DWORD dwTargetAddr, DWORD dwTargetPort, LPVOID lpUserValue)
{
        SOCKADDR_IN addr = {0};
        addr.sin_family = AF_INET;
        addr.sin_port = htons((USHORT)dwTargetPort);
        addr.sin_addr.s_addr= htonl(dwTargetAddr);
        int ret = ::sendto(hSocket, lpBuf, dwSize, 0, (struct sockaddr FAR *) &addr, sizeof(addr));
        return ret;
}


// 初始化SDK
BRAC_InitSDK(...);

// 注册回调函数
BRAC_SetCallBack(BRAC_CBTYPE_NETWORKDATASEND, (void*)OnAnyChatNetworkDataSendCallBack, this);若想自定义发送间隔,则可以:
1、回调函数中:OnAnyChatNetworkDataSendCallBack,保存数据到一个列表中,保存目标地址,保存Socket句柄,然后返回数据长度(return dwSize),欺骗内核数据发送成功了;
2、另外开一个数据发送的线程,重列表中取数据,取目标地址,取Socket句柄,然后调用sendto函数真正发送数据;
3、需要考虑多线程的互斥,保存数据到列表、发送数据线程取数据时,需要对列表加锁处理;
4、不能对lpBuf进行拆包,如dwSize=1000,先发前面的500,再发后面的500,会导致数据接收失败,因为接收端不会自己组包。

页: [1]
查看完整版本: 2015-05-21 客户端SDK开放网络数据发送回调接口