This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

tcp传输问题



用的是C6657,利用NDK通过tcp进行数据传输,希望传输一张图片,大小约为1M。一开始在虚拟机上的ubuntu上进行传输,可以传输,但是速度较慢。于是我重新安装了一个ubuntu系统,并将原先可以运行的代码复制过去,但是在新系统上无法一次传输成功了。两边的传输代码如下:

ubuntu:while(len<ContentLength){len = send(sockfd, buf, ContentLength, 0);}

C6657: while (len < ContentLength ){len = recv( htmlSock, gRxBuffer, ContentLength, MSG_WAITALL );}

ContentLength都等于1228868。两端设备连接成功,可以相互发送一些短数据,所以应该不是连接的问题。发送端一直阻塞在send处。我尝试把发送的数据量减小,当发送量为20000时ubuntu端显示发送成功,只不过C6657端没有接受满ContentLength的数据量而继续阻塞而已。后来我又尝试把预定发送的数据量分开循环发送,每次发送20000,但是运行之后只有第一次发送成功,之后又会阻塞在send处。

因为在虚拟机中测试的时候是可以成功的,我换过电脑,但也会出现以上的问题,所以我不确定是哪边的问题。请问这种情况有可能是C6657方面的问题吗?比如recv函数出错什么的?该如何检测?

  • 我又尝试了一下,发现两端数据都设置为20000的时候,ubuntu端可以发送,但是C6657仍然接收失败。我在接收代码后面添加了一句printf,但是运行时这一句一直不打印,所以我觉得程序一直在recv处或者直接跑飞了。后来我又把数据量降到1000,这次可以接受了。请问这是C6657的接收数据量有限制的原因吗?如果是的话怎样修改?还有虚拟机里能运行可能是什么原因?

  •   问一下,程序中是否有使用中断模块呢?

      与设置的”CFGTAG_IP, CFGITEM_IP_SOCKTCPTXBUF,“ 参数是否有关呢?

      send()函数阻塞之前,成功发送了多少字节呢?

  • dodge ,

    您好!我觉得我没有用到中断模块。接收函数是和连接函数在一个线程中的,所以我认为工程已经运行到了接收函数处。我在实际接收图像数据之前先让ubuntu和C6657相互发送了一句“start”,这一行为能够成功,双方都接收到了对方发过来的字符串。

    请问您想问的是否是“ CFGTAG_IP, CFGITEM_IP_SOCKTCPRXBUF”参数?因为C6657主要用于接收,所以感觉应该是这个参数。我的工程中没有设置这个参数,所以应该是默认数值。但是如前面所说,我之前用虚拟机传输的时候是可以成功的,所以不知道是否与这一参数有关,之后我会尝试一下。

    我不知道该如何查看send函数已经发送的数据,我本意是希望一次性发送的。请问有什么方法可以查看吗?我尝试过将传送数据量减小,虽然没有每个都尝试,但是设置收和发都为5000字节时ubuntu显示发送完成,而C6657没有显示接收完成。当数据量为1000字节时双方才都不阻塞。(我检测是否成功都是在该条语句后面加printf语句打印信息)。

    请问能从这些信息中想到什么可能性吗?谢谢!

  • 你好。

    检查send发送的数据,我并没有特别好方法,我是采用检查其返回值的办法进行检查的,即当send返回值与我们希望发送的字节数一致时,即认为数据发送出去。

    PS:据说是有printf语句会造成程序重入及各类不知名错误,建议少使用。

    我遇到的问题是在中断模式下采样TCP协议发送数据,程序会阻塞到send函数处,不知你有何高见呢?

    我的邮箱:an369kang@126.com     可以详细交流下!

  • 不好意思,我对dsp的中断不了解,应该帮不上什么忙。。。

  • 同样遇到相似问题,我测试双方最大可发送字符在1400字节左右,请问楼主是怎么解决这个矛盾的?

  • 我在pc端把数据分开发送,每两次发送之间加了延时。

  • 啊哦。。。。非常感谢。