近日,写了个局域网内的 “服务器-客户端” 程序(都是linux的),我写的是服务端,客户端另外两个人写。
然后出现了个问题,数据经常不正确,后来,我帮他找到了问题,他们那边多线程使用同一个SOCKET进行发送数据,没加互斥,导致了数据交错。 然后那人就跟我说了,你程序应该判断这个数据是那个线程发过来的啊,说我的程序兼容性不好。
然后还给我讲了好多好多的网络编程技术(他说他以前是做4G网络通讯设备开发的,跟我讲TCP包头,IP包头什么的),其中有个关键点就是,2个程序之间TCP连接的时候,一方程序关闭或者电脑关闭或者拔掉网线,另一方是不知道的,发送方还可以继续发送数据,因为发送方只是将数据放入本地缓存中,并不知道也不管对方在不在, 所以,需要心跳包来维持TCP连接,根据心跳包丢失数量来确认网络已断,(我们之间是有做了心跳包的,一定时间内收不到他的数据,就会踢掉客户端),等等等等,跟我扯了半个多小时,指出我好多好多的错误,最后,跟我讲,这个互斥,我们这边可以加一下。
其他我都无所谓了,有一点“一方程序关闭或者电脑关闭或者拔掉网线,另一方是不知道”,如此地贬低TCP,我就不开心了,Stevens叔叔的《TCP/IP详解》的三卷我也粗粗地过了2遍了,虽说第二卷好些地方看不懂,但是我还是很相信TCP的可靠性的,我相信TCP不至于这么鸡肋,然后就写了个测试客户端程序跟我的程序进行通讯(个人习惯用VS,就拿VS写了一个客户端),经测试任意一方关闭程序,对方马上就可以知道啊,然后他跟我说,WINDOWS可以,linux不行;我就把测试客户端程序改了一下,linux下运行也是一方关闭另一方马上知道啊,然后他跟我说,拔网线肯定对方不知道,我要不要拔一下网线试试呢? 跟我讲网络编程知识的是我们部门大领导啊,我敢不敢再测一下拔网线呢?
然后出现了个问题,数据经常不正确,后来,我帮他找到了问题,他们那边多线程使用同一个SOCKET进行发送数据,没加互斥,导致了数据交错。 然后那人就跟我说了,你程序应该判断这个数据是那个线程发过来的啊,说我的程序兼容性不好。
然后还给我讲了好多好多的网络编程技术(他说他以前是做4G网络通讯设备开发的,跟我讲TCP包头,IP包头什么的),其中有个关键点就是,2个程序之间TCP连接的时候,一方程序关闭或者电脑关闭或者拔掉网线,另一方是不知道的,发送方还可以继续发送数据,因为发送方只是将数据放入本地缓存中,并不知道也不管对方在不在, 所以,需要心跳包来维持TCP连接,根据心跳包丢失数量来确认网络已断,(我们之间是有做了心跳包的,一定时间内收不到他的数据,就会踢掉客户端),等等等等,跟我扯了半个多小时,指出我好多好多的错误,最后,跟我讲,这个互斥,我们这边可以加一下。
其他我都无所谓了,有一点“一方程序关闭或者电脑关闭或者拔掉网线,另一方是不知道”,如此地贬低TCP,我就不开心了,Stevens叔叔的《TCP/IP详解》的三卷我也粗粗地过了2遍了,虽说第二卷好些地方看不懂,但是我还是很相信TCP的可靠性的,我相信TCP不至于这么鸡肋,然后就写了个测试客户端程序跟我的程序进行通讯(个人习惯用VS,就拿VS写了一个客户端),经测试任意一方关闭程序,对方马上就可以知道啊,然后他跟我说,WINDOWS可以,linux不行;我就把测试客户端程序改了一下,linux下运行也是一方关闭另一方马上知道啊,然后他跟我说,拔网线肯定对方不知道,我要不要拔一下网线试试呢? 跟我讲网络编程知识的是我们部门大领导啊,我敢不敢再测一下拔网线呢?
解决方案 »
- Liunx Crontab 定时启动 执行两次的问题
- 请教大家一个问题,我用A服务器怎么才能知道B服务器的一些服务,比如说tomcat是否正常运行
- CentOS搭建IDE的问题
- 在linux如何修改BIOS引导顺序?esxi就每次安装完都能改引导顺序,他是如何实现的?
- 进程的读写锁如何实现?
- ROS操作系统catkin_make后出现问题
- qt中执行的shell脚本需要root权限,怎么办?
- 如何将自己使用的CentOS系统打包成安装iso文件,在别的电脑上直接安装使用?
- make zImage遇到的问题,各位大佬帮忙解决一下啊
- 求解啊
- linux下如何对比两个文件夹差别并生成补丁文件
- 关于ssh localhost后的报错问题
但设想一下拔网线的情况,这时是不可能有FIN,ACK包发出来的,所以双方都不会知道连接已经丢失,这时候一般是重传数次,然后报错。这个就不演示了,楼主可以用wireshark自己实验一下。
2. 有一种情况可能检测不到,就是从链路层断开连接了,这个必须通过设置心跳包来自动管理
3. 判断数据从哪个线程过来,这个明显属于应用层面的工作了。你们定义一个简单的交互协议就可以解决了(比如带上一个唯一的ID之类的),同TCP通讯没有关系的。
拔掉网线的时候,send的确没有返回失败,但是,dmesg 显示了好多的”found a client with no channel in the client's hash table",说明系统是知道拔掉网线了,现在的问题是程序如何获取到这个消息呢
1.如果是拔掉的是你的计算机和交换机之间的网线,而对方的网线正常,那么对方确实是不知道
2.如果是你的进程关闭的话,对方应该会收到网络断开命令的
3.如果进程被任务管理器强制关闭的话,不知道对方是否会知道,但我想可能会知道的吧(我不确定的)
4.TCP通讯是应该做心跳的