socket连续send数据阻塞

ttaaooyyaann77 2014-12-22 09:41:23
用MFC搭一个界面与DSP进行通信,连续调用send函数,数据量大时,发送速度很慢,这个是什么问题啊?应该怎么修改程序呢?
...全文
717 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
brk1985 2014-12-29
  • 打赏
  • 举报
回复
引用 18 楼 ttaaooyyaann77 的回复:
[quote=引用 17 楼 wxhxj0268 的回复:] 晕,TCP程序中还要使用Sleep,居然还是10ms
Sleep太消耗时间,而且发送数据量大的时候不起作用...有什么好的方法吗?连续调用send会不会出问题啊?目前只能达到5M/s的样子,但是DSP往界面发数据能达到几十兆每秒...好郁闷[/quote] 在主线程上 点击发送按钮后,也就是发送按钮触发函数里,开启一个新的线程处理发送业务逻辑,界面就不会卡住了。
ttaaooyyaann77 2014-12-29
  • 打赏
  • 举报
回复
引用 17 楼 wxhxj0268 的回复:
晕,TCP程序中还要使用Sleep,居然还是10ms
Sleep太消耗时间,而且发送数据量大的时候不起作用...有什么好的方法吗?连续调用send会不会出问题啊?目前只能达到5M/s的样子,但是DSP往界面发数据能达到几十兆每秒...好郁闷
阿先森 2014-12-29
  • 打赏
  • 举报
回复
查找本机网卡,建议使用CxNetworkAdapterFind http://www.cnblogs.com/EdmundDwyane/p/3233438.html 查找本机IP,建议使用CxLocalHostIPAddrFind http://www.cnblogs.com/EdmundDwyane/p/3200494.html 网络通信,建议使用CxClientSocket/CxServerSocket/CxUdpSocket http://www.cnblogs.com/EdmundDwyane/p/3248297.html http://www.cnblogs.com/EdmundDwyane/p/3278641.html http://www.cnblogs.com/EdmundDwyane/p/3218838.html
假正经的班长 2014-12-29
  • 打赏
  • 举报
回复
引用 16 楼 ttaaooyyaann77 的回复:
[quote=引用 15 楼 cjqpker 的回复:] [quote=引用 14 楼 ttaaooyyaann77 的回复:] [quote=引用 12 楼 cjqpker 的回复:] [quote=引用 10 楼 ttaaooyyaann77 的回复:] [quote=引用 2 楼 cjqpker 的回复:] 得搞清楚为什么慢,是由于网络状况问题,还是程序优化的不好。 理论上TCP应该几乎可以把带宽占光。 还有种可能是DSP端处理过慢或者程序有问题导致传输过慢。这种问题可以先光接收数据,接收完了直接丢掉,可以查看是否是由于数据处理过慢导致网络传输等待
DSP端处理程序不是很懂啊,觉得可能是DSP端没有及时回ACK包导致发送缓冲区一直不能清空造成数据阻塞,但是不知道有什么好办法可以解决啊[/quote] TCP做返回确认,没什么意义。 你的界面卡死是7楼说的,单线程发送,界面肯定卡死。不过你可以用360之类查看你的网络实时速度 另外,怀疑你虽然用的是千兆网,但你局域网的交换机或者路由器或者DSP端是百兆,那样实际最大也就12M左右封顶了。[/quote] ACK包应该是TCP/IP协议自己发送的,目前是怀疑可能是DSP端接收很慢导致不能及时回复ACK包,这样界面这边发送缓冲区不能清空,数据就一直阻塞;我只是将文本里的数据读取出来发送出去,这个要用多线程处理吗?应该如何处理呢? 之前DSP向界面发送数据能够达到几十兆每秒,这是不是说明网络应该是没有问题的?[/quote] 能达到几十兆,说明是千兆网没问题。 “DSP端接收很慢导致不能及时回复ACK包”,不要去关心这一点了,ACK包你也不能加以干预。 建议你做个测试,PC端不读取文件,构建一个1KB的char数组,循环向DSP发送。DSP端仅循环接收数据,接收到数据后什么也不做。执行这样的简单程序,然后使用360等工具查看你的实时网速,看看能达到多少。界面卡死先不要去管,先检测是否是传输过程很慢。如果速度还不错,那就是某一端处理的速度跟不上。[/quote] 测试了一下,5M能在1s内发送完毕,发送数据超过5M界面就卡死,会不会是因为连续调用send函数啊?因为每次只发1KB,发送5M的话就要调用5*1024次,会不会是这个原因呢?[/quote] 按照17楼说的,我没看你的代码。连续调用send没问题,中间不用Sleep。只是如果数据量大, 调用send时最好用专门的线程去处理。如果你暂时先不管卡死这个问题,就把Sleep去掉。发送速度正常了之后,再建个线程去单独处理send
笨笨仔 2014-12-29
  • 打赏
  • 举报
回复
我们的通信都是应答式由事件驱动,数据量多时可分成大块传送,不可能出现阻塞。
笨笨仔 2014-12-28
  • 打赏
  • 举报
回复
晕,TCP程序中还要使用Sleep,居然还是10ms
ttaaooyyaann77 2014-12-28
  • 打赏
  • 举报
回复
引用 15 楼 cjqpker 的回复:
[quote=引用 14 楼 ttaaooyyaann77 的回复:] [quote=引用 12 楼 cjqpker 的回复:] [quote=引用 10 楼 ttaaooyyaann77 的回复:] [quote=引用 2 楼 cjqpker 的回复:] 得搞清楚为什么慢,是由于网络状况问题,还是程序优化的不好。 理论上TCP应该几乎可以把带宽占光。 还有种可能是DSP端处理过慢或者程序有问题导致传输过慢。这种问题可以先光接收数据,接收完了直接丢掉,可以查看是否是由于数据处理过慢导致网络传输等待
DSP端处理程序不是很懂啊,觉得可能是DSP端没有及时回ACK包导致发送缓冲区一直不能清空造成数据阻塞,但是不知道有什么好办法可以解决啊[/quote] TCP做返回确认,没什么意义。 你的界面卡死是7楼说的,单线程发送,界面肯定卡死。不过你可以用360之类查看你的网络实时速度 另外,怀疑你虽然用的是千兆网,但你局域网的交换机或者路由器或者DSP端是百兆,那样实际最大也就12M左右封顶了。[/quote] ACK包应该是TCP/IP协议自己发送的,目前是怀疑可能是DSP端接收很慢导致不能及时回复ACK包,这样界面这边发送缓冲区不能清空,数据就一直阻塞;我只是将文本里的数据读取出来发送出去,这个要用多线程处理吗?应该如何处理呢? 之前DSP向界面发送数据能够达到几十兆每秒,这是不是说明网络应该是没有问题的?[/quote] 能达到几十兆,说明是千兆网没问题。 “DSP端接收很慢导致不能及时回复ACK包”,不要去关心这一点了,ACK包你也不能加以干预。 建议你做个测试,PC端不读取文件,构建一个1KB的char数组,循环向DSP发送。DSP端仅循环接收数据,接收到数据后什么也不做。执行这样的简单程序,然后使用360等工具查看你的实时网速,看看能达到多少。界面卡死先不要去管,先检测是否是传输过程很慢。如果速度还不错,那就是某一端处理的速度跟不上。[/quote] 测试了一下,5M能在1s内发送完毕,发送数据超过5M界面就卡死,会不会是因为连续调用send函数啊?因为每次只发1KB,发送5M的话就要调用5*1024次,会不会是这个原因呢?
假正经的班长 2014-12-27
  • 打赏
  • 举报
回复
引用 14 楼 ttaaooyyaann77 的回复:
[quote=引用 12 楼 cjqpker 的回复:] [quote=引用 10 楼 ttaaooyyaann77 的回复:] [quote=引用 2 楼 cjqpker 的回复:] 得搞清楚为什么慢,是由于网络状况问题,还是程序优化的不好。 理论上TCP应该几乎可以把带宽占光。 还有种可能是DSP端处理过慢或者程序有问题导致传输过慢。这种问题可以先光接收数据,接收完了直接丢掉,可以查看是否是由于数据处理过慢导致网络传输等待
DSP端处理程序不是很懂啊,觉得可能是DSP端没有及时回ACK包导致发送缓冲区一直不能清空造成数据阻塞,但是不知道有什么好办法可以解决啊[/quote] TCP做返回确认,没什么意义。 你的界面卡死是7楼说的,单线程发送,界面肯定卡死。不过你可以用360之类查看你的网络实时速度 另外,怀疑你虽然用的是千兆网,但你局域网的交换机或者路由器或者DSP端是百兆,那样实际最大也就12M左右封顶了。[/quote] ACK包应该是TCP/IP协议自己发送的,目前是怀疑可能是DSP端接收很慢导致不能及时回复ACK包,这样界面这边发送缓冲区不能清空,数据就一直阻塞;我只是将文本里的数据读取出来发送出去,这个要用多线程处理吗?应该如何处理呢? 之前DSP向界面发送数据能够达到几十兆每秒,这是不是说明网络应该是没有问题的?[/quote] 能达到几十兆,说明是千兆网没问题。 “DSP端接收很慢导致不能及时回复ACK包”,不要去关心这一点了,ACK包你也不能加以干预。 建议你做个测试,PC端不读取文件,构建一个1KB的char数组,循环向DSP发送。DSP端仅循环接收数据,接收到数据后什么也不做。执行这样的简单程序,然后使用360等工具查看你的实时网速,看看能达到多少。界面卡死先不要去管,先检测是否是传输过程很慢。如果速度还不错,那就是某一端处理的速度跟不上。
ttaaooyyaann77 2014-12-26
  • 打赏
  • 举报
回复
引用 12 楼 cjqpker 的回复:
[quote=引用 10 楼 ttaaooyyaann77 的回复:] [quote=引用 2 楼 cjqpker 的回复:] 得搞清楚为什么慢,是由于网络状况问题,还是程序优化的不好。 理论上TCP应该几乎可以把带宽占光。 还有种可能是DSP端处理过慢或者程序有问题导致传输过慢。这种问题可以先光接收数据,接收完了直接丢掉,可以查看是否是由于数据处理过慢导致网络传输等待
DSP端处理程序不是很懂啊,觉得可能是DSP端没有及时回ACK包导致发送缓冲区一直不能清空造成数据阻塞,但是不知道有什么好办法可以解决啊[/quote] TCP做返回确认,没什么意义。 你的界面卡死是7楼说的,单线程发送,界面肯定卡死。不过你可以用360之类查看你的网络实时速度 另外,怀疑你虽然用的是千兆网,但你局域网的交换机或者路由器或者DSP端是百兆,那样实际最大也就12M左右封顶了。[/quote] ACK包应该是TCP/IP协议自己发送的,目前是怀疑可能是DSP端接收很慢导致不能及时回复ACK包,这样界面这边发送缓冲区不能清空,数据就一直阻塞;我只是将文本里的数据读取出来发送出去,这个要用多线程处理吗?应该如何处理呢? 之前DSP向界面发送数据能够达到几十兆每秒,这是不是说明网络应该是没有问题的?
ttaaooyyaann77 2014-12-26
  • 打赏
  • 举报
回复
引用 11 楼 wxhxj0268 的回复:
[quote=引用 8 楼 ttaaooyyaann77 的回复:] [quote=引用 7 楼 wxhxj0268 的回复:] 你单线程完成全部工作?
发送是在一个线程里面完成的,只有一个send函数还需要开辟多线程吗?[/quote] 只你就做了个发送程序吗?那么每次的发送数据块大小是多少?是连续发送还是收到应答后再发送?这些问题搞清楚不就知道问题在哪了[/quote] 是的,主线程就只是发送数据,每次发送960B(因为说是以太网还是什么的每帧数据最大是1460B),一开始是连续发送,每次发送之间调用Sleep暂停10ms,但是发送次数大于100次左右两边调试会卡死,后来让DSP回确认包后再发送,程序跑下来没有问题,就是速度很慢,只能达到1M/s 的样子...
假正经的班长 2014-12-23
  • 打赏
  • 举报
回复
引用 10 楼 ttaaooyyaann77 的回复:
[quote=引用 2 楼 cjqpker 的回复:] 得搞清楚为什么慢,是由于网络状况问题,还是程序优化的不好。 理论上TCP应该几乎可以把带宽占光。 还有种可能是DSP端处理过慢或者程序有问题导致传输过慢。这种问题可以先光接收数据,接收完了直接丢掉,可以查看是否是由于数据处理过慢导致网络传输等待
DSP端处理程序不是很懂啊,觉得可能是DSP端没有及时回ACK包导致发送缓冲区一直不能清空造成数据阻塞,但是不知道有什么好办法可以解决啊[/quote] TCP做返回确认,没什么意义。 你的界面卡死是7楼说的,单线程发送,界面肯定卡死。不过你可以用360之类查看你的网络实时速度 另外,怀疑你虽然用的是千兆网,但你局域网的交换机或者路由器或者DSP端是百兆,那样实际最大也就12M左右封顶了。
笨笨仔 2014-12-23
  • 打赏
  • 举报
回复
引用 8 楼 ttaaooyyaann77 的回复:
[quote=引用 7 楼 wxhxj0268 的回复:] 你单线程完成全部工作?
发送是在一个线程里面完成的,只有一个send函数还需要开辟多线程吗?[/quote] 你就只做了个发送程序吗?那么每次的发送数据块大小是多少?是连续发送还是收到应答后再发送?这些问题搞清楚不就知道问题在哪了
ttaaooyyaann77 2014-12-23
  • 打赏
  • 举报
回复
引用 2 楼 cjqpker 的回复:
得搞清楚为什么慢,是由于网络状况问题,还是程序优化的不好。 理论上TCP应该几乎可以把带宽占光。 还有种可能是DSP端处理过慢或者程序有问题导致传输过慢。这种问题可以先光接收数据,接收完了直接丢掉,可以查看是否是由于数据处理过慢导致网络传输等待
DSP端处理程序不是很懂啊,觉得可能是DSP端没有及时回ACK包导致发送缓冲区一直不能清空造成数据阻塞,但是不知道有什么好办法可以解决啊
ttaaooyyaann77 2014-12-23
  • 打赏
  • 举报
回复
引用 1 楼 Evankaka 的回复:
可以这样干,你每次send之后,接收端得返回一个确定给发送端,发送段才进行下一次send.这样就会好多了,send并不是确定数据发送给接收端就执行下一步了,而是把它们发送到发送缓冲区,然后它就返回了,然后发送缓冲区会根据网速调整发送的速度。
接收端返回数据再发送速度只能达到1M/s,用的是千兆网,这个速度实在是太慢了啊,还有没有其他方法能提高速度啊
ttaaooyyaann77 2014-12-23
  • 打赏
  • 举报
回复
引用 7 楼 wxhxj0268 的回复:
你单线程完成全部工作?
发送是在一个线程里面完成的,只有一个send函数还需要开辟多线程吗?
笨笨仔 2014-12-23
  • 打赏
  • 举报
回复
你单线程完成全部工作?
ttaaooyyaann77 2014-12-23
  • 打赏
  • 举报
回复
引用 3 楼 wxhxj0268 的回复:
你的发送和接收机制是如何设计的?
发送是从文本中读取数据后在while语句中循环发送,DSP端大概就是有一个接收函数,然后把数据存入DDR,具体不是很懂,下面是MFC中send的代码,麻烦大家看一下啊,应该怎么修改啊 while((file_net.ReadString(str) != FALSE) && (line < 80)) //读取处理读到的每一行数据 { strTxt+=str; strTxt+=" "; line++; if(line==80) { err=send(aSocket,strTxt, strTxt.GetLength(),0); //发送内容给服务器 if (err==960) //判断send函数返回值,正确即代表成功将数据复制到缓冲区 { line=0; //将行数清零 count++; //发送次数加1 strTxt=_T(""); //发送变量清空 char recvbuf[4]=" "; //接收缓冲区 err=recv(aSocket,recvbuf,4,0); if (err==2) //判断接收字节是否正确 { CString recvstr=recvbuf; //将char型转换为CString if (recvstr=="99") { continue; //如果接收正确就继续 } } else { AfxMessageBox("接收失败"); //否则显示失败,跳出程序 break; } } else //判断send函数返回值,不正确即代表发送的数据没能成功复制到缓冲区 { AfxMessageBox("copy FAILED!"); break; } } str=_T(""); if(count== 3823) //判断发送的次数 { AfxMessageBox("发送完毕"); //发送完毕弹窗显示 int line=0; //清空读的行数 int count=0; //清空发送次数 break; } }
ttaaooyyaann77 2014-12-23
  • 打赏
  • 举报
回复
发送是从文本中读取数据后在while语句中循环发送,DSP端大概就是有一个接收函数,然后把数据存入DDR,具体不是很懂,下面是MFC中send的代码,麻烦大家看一下啊,应该怎么修改啊 while((file_net.ReadString(str) != FALSE) && (line < 80)) //读取处理读到的每一行数据 { strTxt+=str; strTxt+=" "; line++; if(line==80) { err=send(aSocket,strTxt, strTxt.GetLength(),0); //发送内容给服务器 if (err==960) //判断send函数返回值,正确即代表成功将数据复制到缓冲区 { line=0; //将行数清零 count++; //发送次数加1 strTxt=_T(""); //发送变量清空 char recvbuf[4]=" "; //接收缓冲区 err=recv(aSocket,recvbuf,4,0); if (err==2) //判断接收字节是否正确 { CString recvstr=recvbuf; //将char型转换为CString if (recvstr=="99") { continue; //如果接收正确就继续 } } else { AfxMessageBox("接收失败"); //否则显示失败,跳出程序 break; } } else //判断send函数返回值,不正确即代表发送的数据没能成功复制到缓冲区 { AfxMessageBox("copy FAILED!"); break; } } str=_T(""); if(count== 3823) //判断发送的次数 { AfxMessageBox("发送完毕"); //发送完毕弹窗显示 int line=0; //清空读的行数 int count=0; //清空发送次数 break; } }
ttaaooyyaann77 2014-12-23
  • 打赏
  • 举报
回复
如果接收端发数据返回确认,传输速度只能达到1M/s,不知道是不是因为来回确认消耗了时间;但是如果不发数据返回确认即使DSP端仅仅接收,在发送数据达到6M左右界面就会卡死...不太懂DSP,不知道是不是网上说的发送缓冲区太小的原因,但是我重新设置之后还是没效果...目前还没想到解决方案啊
笨笨仔 2014-12-23
  • 打赏
  • 举报
回复
你的发送和接收机制是如何设计的?
加载更多回复(2)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧