|
我用创龙6655开发板带的例子NDK_Runtime,自己改了一个与dps互传文件的程序。
经过试验发现,通信过程中,如果pc发出的tcp包,包内数据长超过1455,则dsp端会抛弃这个包不做响应(mss为1460)。
dps端的接受动作为在Deamon中接受通信头以后按照通信头所指定的长度接受文件数据。
通信头固定长284,文件数据长度不定。
ndk的配置内容如下。
Void NDKTask(UArg a0, UArg a1)
{
int rc;
// 初始化操作系统环境
// 必须在使用 NDK 之前最先调用
rc = NC_SystemOpen(NC_PRIORITY_LOW, NC_OPMODE_INTERRUPT);
if(rc)
{
printf("NC_SystemOpen Failed (%d)\n", rc);
for(;;);
}
// 创建新的配置
HANDLE hCfg;
hCfg = CfgNew();
if(!hCfg)
{
printf("Unable to create configuration\n");
goto Exit;
}
// 配置主机名
if(strlen( DomainName ) >= CFG_DOMAIN_MAX || strlen( HostName ) >= CFG_HOSTNAME_MAX)
{
printf("Names too long\n");
goto Exit;
}
// 添加全局主机名到 hCfg(对所有连接域有效)
CfgAddEntry(hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_HOSTNAME, 0, strlen(HostName), (UINT8 *)HostName, 0);
{
CI_IPNET NA;
CI_ROUTE RT;
IPN IPTmp;
// 配置 IP
bzero(&NA, sizeof(NA));
NA.IPAddr = inet_addr(StaticIPAddr);
NA.IPMask = inet_addr(LocalIPMask);
strcpy(NA.Domain, DomainName);
NA.NetType = 0;
// 添加地址到接口 1
CfgAddEntry(hCfg, CFGTAG_IPNET, 1, 0, sizeof(CI_IPNET), (UINT8 *)&NA, 0);
// 配置 默认网关
bzero(&RT, sizeof(RT));
RT.IPDestAddr = 0;
RT.IPDestMask = 0;
RT.IPGateAddr = inet_addr(GatewayIP);
// 配置 路由
CfgAddEntry(hCfg, CFGTAG_ROUTE, 0, 0, sizeof(CI_ROUTE), (UINT8 *)&RT, 0);
// 配置 DNS 服务器
IPTmp = inet_addr(DNSServer);
if(IPTmp)
CfgAddEntry(hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_DOMAINNAMESERVER, 0, sizeof(IPTmp), (UINT8 *)&IPTmp, 0);
}
// 配置协议栈选项
// 显示警告消息
rc = DBG_INFO;
CfgAddEntry(hCfg, CFGTAG_OS, CFGITEM_OS_DBGPRINTLEVEL, CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0);
rc = 8192;
CfgAddEntry(hCfg, CFGTAG_IP, CFGITEM_IP_SOCKTCPTXBUF, CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0);
// TCP 接收 buffer 大小(copy 模式)
rc = 8192;
CfgAddEntry(hCfg, CFGTAG_IP, CFGITEM_IP_SOCKTCPRXBUF, CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0);
// TCP 接收限制大小(non-copy 模式)
rc = 8192;
CfgAddEntry(hCfg, CFGTAG_IP, CFGITEM_IP_SOCKTCPRXLIMIT, CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0);
// UDP 接收限制大小
rc = 8192;
CfgAddEntry(hCfg, CFGTAG_IP, CFGITEM_IP_SOCKUDPRXLIMIT, CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0);
// 使用当前配置启动 NDK 网络
do
{
rc = NC_NetStart(hCfg, NetworkOpen, NetworkClose, NetworkIPAddr);
} while(rc > 0);
// 停止消息
printf("NDK Task has been stop(Return Code %d)!\r\n", rc);
// 删除配置
CfgFree(hCfg);
// 退出
goto Exit;
Exit:
NC_SystemClose();
TaskExit();
}
DSP端接收程序动作示例如下
以下函数由Deamon启动
#define FILE_TRANS_CMD_BUFF_SIZE 284
#define FILE_TRANS_DATA_BUFF_SIZE 1024
int ft_task( SOCKET wkst_s, UINT32 wku32_unused ){
if ( ( wks32_rcvedsize = recv( wkst_s, &wkst_ftcmdbuf, FILE_TRANS_CMD_BUFF_SIZE, 0 ) ) > 0 )
{
do
{
wks32_rcvsize = recv( wkst_s, wkpu8_databuff, FILE_TRANS_DATA_BUFF_SIZE, 0 );
if ( wks32_rcvsize > 0 )
{
//数据保存到ram,检查已接受文件长度是否等于wkst_ftcmdbuf中指定长度
}
wku32_datasize += wks32_rcvsize;
} while ( wks32_rcvsize == FILE_TRANS_DATA_BUFF_SIZE );
}
}
试验过程中发现,传送文件较大时,PC会直接发出Jumbo Packet,这时候DSP不做响应,
而后PC端按照MSS重发数据,单个TCP包数据长为1460(帧总长1514),但是对于重发TCP包DSP依然不做响应,
DSP程序收不到数据,抓包也没有ACK。
后手动调整文件大小,当文件小于1455时(即,单个TCP包内数据长小于1455),能正常和DSP通信完成文件传递,
但是当文件大小处于1456(即,单个TCP包内数据大于1455)以上时,DSP不响应TCP包,无法完成数据传递。
同时,在发生dsp不响应的时候,tcp链接并没有关闭,之后的通信如果发送包为1455以下的包,依然能正常通信。
不知道这个问题应该如何解决?
抓包数据如下
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|