博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在tcp半开连接(也就是死连接)上send数据, send函数会成功吗? 后续会怎样?
阅读量:4142 次
发布时间:2019-05-25

本文共 2115 字,大约阅读时间需要 7 分钟。

       A, B两端tcp建立连接后, 如果中间的交换机断网、断电, 或者B端突然断电, 那么A是无感知的(不考虑心跳机制)。 有些书上喜欢把这种连接叫半开连接, 其实我更愿意叫它为死连接。 

       此时, 如果A端send一些数据, 会怎样呢? 只要A端的发送内核缓冲区没有满(一般都没满), 那么send函数就是成功返回得, 很显然, 在B端是接收不到数据的。 这再次说明了, send函数和实际发送数没有半毛钱的关系, 这一点, 我们在之前的博文中多次说过。

       A发送数据后, 期望收到B的ACK包, 但显然收不到, 于是, A端的协议栈会自动进行重传, 这是tcp最基本的机制之一。 当重传次数达到一定上线后, 就会发RST包, 重置连接, 死连接就彻底死了。

      我现在暂时无法构造出上述断网的场景, 有兴趣的可以可以帮试试, 代码如下:

      服务端:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(){ int sockSrv = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_addr.s_addr = INADDR_ANY; addrSrv.sin_port = htons(8765); bind(sockSrv, (const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in)); listen(sockSrv, 5); struct sockaddr_in addrClient; int len = sizeof(struct sockaddr_in); int sockConn = accept(sockSrv, (struct sockaddr *)&addrClient, (socklen_t*)&len); while(1) { getchar(); char szRecvBuf[1001] = {0}; int iRet = recv(sockConn, szRecvBuf, sizeof(szRecvBuf) - 1, 0); printf("iRet is %d\n", iRet); } getchar(); close(sockConn); close(sockSrv); return 0;}
       客户端:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(){ int sockClient = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addrSrv; addrSrv.sin_addr.s_addr = inet_addr("10.100.70.140"); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(8765); connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in)); #define N 2000 char szSendBuf[N] = {0}; for(unsigned int i = 0; i < N; i++) //×Ö·ûÊý×é×îºóÒ»¸ö×Ö·û²»ÒªÇóÊÇ¡®\0¡¯ { szSendBuf[i] = 'a'; } int total = 0; while(1) { int iRet = send(sockClient, szSendBuf, sizeof(szSendBuf) , 0); total += iRet; printf("iRet is %d, total send is %d\n", iRet, total); getchar(); } close(sockClient); return 0;}
        一起来试试吧。 有疑问请反馈。

         

         睡觉。

转载地址:http://nnwti.baihongyu.com/

你可能感兴趣的文章
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
db db2_monitorTool IBM Rational Performace Tester
查看>>
postgresql监控工具pgstatspack的安装及使用
查看>>
【JAVA数据结构】双向链表
查看>>
【JAVA数据结构】先进先出队列
查看>>
Objective-C 基础入门(一)
查看>>
Flutter Boost的router管理
查看>>
C++模板
查看>>
【C#】如何实现一个迭代器
查看>>
【C#】利用Conditional属性完成编译忽略
查看>>
VUe+webpack构建单页router应用(一)
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>
Spring MVC中使用Thymeleaf模板引擎
查看>>
PHP 7 的五大新特性
查看>>
深入了解php底层机制
查看>>
PHP中的stdClass 【转】
查看>>
XHProf-php轻量级的性能分析工具
查看>>
OpenCV gpu模块样例注释:video_reader.cpp
查看>>
就在昨天,全球 42 亿 IPv4 地址宣告耗尽!
查看>>
Mysql复制表以及复制数据库
查看>>