完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
硬件:TMS320DM648
软件:CCS5.4 NDK2.0.0 问题描述:在使用TCP/IP协议栈的时候,创建socket后,循环使用send函数持续发送数据。但是发送过一段时间后send函数返回错误并退出,错误类型为EWOULDBLOCK,请问这种错误是因为什么导致的(内存不够?),以及怎么解决? 1. Socket配置代码: // Create the main TCP socketstcp = socket(AF_INET, SOCK_STREAM, 0);if( stcp == INVALID_SOCKET )[ printf("Fail socket, %dn", fdError()); goto leave;]// Set Pmort = 9528, IP address = IPAddrSendIPAddr = inet_addr(RemoteIPAddr);bzero( &sin1, sizeof(struct sockaddr_in) );sin1.sin_family = AF_INET;sin1.sin_len = sizeof( sin1 );sin1.sin_addr.s_addr = IPAddr;sin1.sin_port = htons(9528);to.tv_sec = 5;to.tv_usec = 0;setsockopt( stcp, SOL_SOCKET, SO_SNDtiMEO, &to, sizeof( to ) );setsockopt( stcp, SOL_SOCKET, SO_RCVTIMEO, &to, sizeof( to ) );uart_write("connect to the server:");uart_write(RemoteIPAddr);while(connect( stcp, (PSA) &sin1, sizeof(sin1) ) < 0)[ printf("Fail connect, %dn", fdError());]uart_write("Success!n");2. Send任务 while(1)[ if( ((bytes = send( stcp, pBuf , (int)FRAME_SIZE, 0 )) < 0) ) [ printf("send failed (%d)n",fdError()); goto leave; ] if(FRAME_SIZE != bytes) [ printf("send bytes (%d)n",bytes); ] totalBytes += bytes; // Get TSK_idle time to compute CPU load half-way through // number of packets transfers if ( loop == count) [ THRLOAD_getTskTime(&TSK_idle, &tskTime, &totalTime); ]]3. 发送任务出错执行的代码段: (send(...)函数内 --> SockSend(....)函数内) // Check blocking conditionif( SizeCopy < size && !AddCopy )[ // We need to block (protocol did not handle the data ) // Can't block a non-blocking socket // If we timeout, we have an error and break the loop if( (ps->StateFlags & SS_NBIO) || (flags & MSG_DONTWAIT) || !FdWaitEvent( ps, FD_EVENT_WRITE, ps->TxTimeout ) ) [ error = EWOULDBLOCK; break; ]]就是在int SockSend( HANDLE h, char *pBuf, INT32 size, int flags, INT32 *pRetSize )函数中(在sock.c文件),这个函数我的理解是:先检查发送缓冲区是否有空间然后进行数据copy。如果没有空间就进入到上述3中的代码段阻塞等待……如果超时就报错退出,如果产生了可以写的事件则继续copy数据去发送。 注:在发送时出现上述错误退出后,使用的NDK库并没有关闭socket,并且客户端再也无法通过套接字连接DSP了 |
|
相关推荐
6个回答
|
|
这论坛都没人的吗?好冷清
|
|
|
|
|
|
|
|
Hi, Shine 您这里说的buffer size是下图里面的这个大小吗 我们发送缓冲区设置的是65535,这个大小太大了吗? 那多小算小,我们传输实时图像的话设置到多少算合适 |
|
|
|
看看这个贴子: https://e2e.ti.com/support/embedded/tirtos/f/355/t/342555 http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
感谢您的及时答复。现有一个新问题急需帮助: 我下载了NDK2.0.0安装后也打了补丁,但是我在运行NDK中自带的network下的client示例程序时,PC机直连DSP是可以得,并且能够通过http访问,但是放在局域网里就连不上了。PC跟DSP同时接到一个小交换机上。并且ping不通 这是什么原因导致的。 同事说要在csl_emac.c文件的第754段代码新增一段代码,如图: |
|
|
|
yijun362 发表于 2018-6-23 06:28 本帖子反应了两个bug,均为DM648驱动bug,官方给出了解决,但是没有更新NDK2.0.0里的代码,所以在用到的会出错。 一楼的bug:是有DM648驱动下的ethDriver.c文件导致的,解决方案参考如下链接 http://processors.wiki.ti.com/index.php/DM648_Fix_for_NDK_Crash_in_High_Network_Traffic 自己使用时将NDK目录下的src下的hal中的evmDM648文件下的文件替换掉,并在工程中链接该文件。(注意屏蔽掉该文件中没用的etssPrintf()函数相关) 楼上的这个bug:是csl_emac.c的bug,这个bug会导致只能在千兆网口上通信,百兆网就不能了。参考 https://e2e.ti.com/support/embedded/tirtos/f/355/p/57649/205966 |
|
|
|
只有小组成员才能发言,加入小组>>
351 浏览 1 评论
546 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
790 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
660 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1140 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
84浏览 29评论
303浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
261浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
210浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
68浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 10:20 , Processed in 1.086235 second(s), Total 59, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号