AnyChat技术支持论坛
标题:
2015-05-21 客户端SDK开放网络数据发送回调接口
[打印本页]
作者:
admin
时间:
2015-5-21 21:06
标题:
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,会导致数据接收失败,因为接收端不会自己组包。
欢迎光临 AnyChat技术支持论坛 (http://bbs.anychat.cn/)
Powered by Discuz! X3