TCP通讯的时候,发送大量数据会死机

TCP通信的时候,发送大量数据会死机?
我在MFC里面,用socket写了一个TCP通信的程序,异步套接字编程,注册了FD_READ | FD_WRITE | FD_CONNECT | FD_CLOSE事件。在客户端的主线程里面又创建了两个线程,一个线程不断的生成数据,另外一个线程把生成的数据发送出去,只要有数据生成就通过套接字发送。程序运行一段时间就会死机。
发送线程调用send函数发送数据,send(pFrame->m_socket, pBuf,length, 0);
我感觉数据生成的太多,在网络缓冲里面的数据还没有来得及发送的时候,又通过send函数往网络缓冲区中写数据了,最后内存耗尽,导致死机。
请问用什么方法可以解决这个问题呢?
在数据发送的时候如果知道网络发送缓冲区还有多大的空闲容量就可以确定是否要调用send函数了吧?如果网络发送缓冲区满了,就挂起发送数据的线程,如果网络发送缓冲区的空闲容量大于某个值了,就恢复发送数据的线程,这样可以吗?
怎么才能知道网络发送缓冲区是否已经满了?
如何知道网络发送缓冲区的空闲容量呢?

------解决方案--------------------
你不会是因为其它分配的内存资源没有及时释放导致的吧。。。
------解决方案--------------------
底层缓冲区慢了,你send会失败的,所以内存耗尽应该和socket没啥关系。

应该是你程序代码本身的问题

在FD_WRITE里做个计数器 看看缓冲区是否正常释放了。


------解决方案--------------------
当缓冲区被填满了,再次空闲时 会调用FD_WRITE这个事件。


------解决方案--------------------
WireShark之类的工具抓包,然后看看链路上是不是有大量的零窗口出现
------解决方案--------------------
我觉得你怀疑的东西不是问题所在
底层协议如果连这点容错都做不到那TCP/IP协议是不是太脆弱了
你是不是有什么别的相关的位置申请了资源却没有及时释放
------解决方案--------------------
你是运行一段时间内存才被耗尽的,那很应该就是在运行过程中不断的适用内存而没有释放吧,所以才好好看看程序吧,你可以在每次发送之后就及时的清空buffer,接受数据方用完也释放内存,看看有效果没。
------解决方案--------------------
楼主,知道环形缓冲区么?这样缓冲区永远不会满,当然你代码也要处理好了,不然新的数据会把你没处理的缓冲区数据给覆盖了。
------解决方案--------------------
服务器端先加sleep慢慢发过去看看是缓冲问题还是客户端有泄漏.
------解决方案--------------------
你如果缓冲区满了,在send就不会存进缓冲区了,send的返回值表示你成功send了多少数据,你可以看看这个值是多少,还有你说的死机,我觉得可能是你的消息接受有误,接受的消息不正确,导致线程不能够及时释放CPU ,从而导致假死状态。你好好检查你的代码,看有这方面的问题没,还有可以在发送的消息前面加四字节的数据长度校验。。。。,可以试试!
------解决方案--------------------
在每次send()的地方加上返回值的判断(异常判断),加上一点容错处理。死机也很有可能是你程序中哪里出现了死循环。我以前写通讯程序都不加判断发送或接收是否正常,也出现过死机!后来就是这里的问题!你看看你是不是同样的问题!
------解决方案--------------------
我们都在盲人摸象,最好的办法就是把你的代码贴上来,根据代码分析。与缓存没有关系吧,Java里可以设置socket.setTcpNoDelay(true)不使用缓存,vc肯定也能,那你也设置下不使用缓存,看看还死机不
------解决方案--------------------