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

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

你不会是因为其它分配的内存资源没有及时释放导致的吧。。。
1、怎么才能知道网络发送缓冲区是否已经满了?
2、如何知道网络发送缓冲区的空闲容量呢?

如果我知道了前面的两个东西,再改一下程序就知道是不是你说的这个问题了
1。缓冲区慢了会send失败,再次空闲会调用FD_WRITE事件,可以根据这个进行推断是哪出了问题。
2。无法得知,这个是TCP算法决定的,你知道底层缓冲区多大?怎么个发送方法?它会拆成多少个小数据包?怎么个发送方法?恐怕看tcp/ip协议才知道。

错误排查需要你去单步调试 监控数据异常推断的。
没有一眼就能看出来的隐含错误;
我在程序里面可以这样吗?定义一个变量,BOOL m_bSend;当FD_WRITE消息到达的时候,m_bSend为TRUE;当在发送线程中send失败的时候,m_bSend为FALSE。在发送线程中判断m_bSend的值,如果为TRUE,就继续执行下面的发送函数;如果为FALSE,就continue,不执行下面的发送函数。WireShark之类的工具抓包,然后看看链路上是不是有大量的零窗口出现
我觉得你怀疑的东西不是问题所在
底层协议如果连这点容错都做不到那TCP/IP协议是不是太脆弱了
你是不是有什么别的相关的位置申请了资源却没有及时释放
你是运行一段时间内存才被耗尽的,那很应该就是在运行过程中不断的适用内存而没有释放吧,所以才好好看看程序吧,你可以在每次发送之后就及时的清空buffer,接受数据方用完也释放内存,看看有效果没。
楼主,知道环形缓冲区么?这样缓冲区永远不会满,当然你代码也要处理好了,不然新的数据会把你没处理的缓冲区数据给覆盖了。
BIOS时间未必可靠,因为能影响他时间准确性的因素太多。
比如:用户自己修改系统时间(比如是为了防止软件过期或是什么其他原因)、病毒修改系统时间、主板故障导致系统时间重置、有些主板还可能故障到保存不了BIOS信息,每次启动都重置。
如果对于时间比较敏感的应用程序来说,可能就会影响到软件数据的正确性和程序稳定性。比如定时自动提示
或定时控制一些硬件或关键的数据录入时记录的时间等。
外置时钟的需求不是没有的,看应用范围来说的。特别对工控或取其相关的开发上,有时候时间是很重要的
东西,单靠系统BIOS的时间,有时候未必可靠,但结合外部硬件(或Internet时间服务器)加上时间记录
管理过程,就能很好的确保时间的正确性,对于某些工程来说,也是至关重要的解决方案。
来源: 英超直播

你可能感兴趣的:(TCP通信的时候,发送大量数据会死机)