问题1、粘包问题

解决方法一:TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;

解决方法二:发送固定长度的消息

解决方法三:把消息的尺寸与消息一块发送

解决方法四:双方约定每次传送的大小

解决方法五:双方约定使用特殊标记来区分消息间隔

解决方法六:标准协议按协议规则处理,如Sip协议

问题2、字符串编码问题

将中文字符串用utf8编码格式转换为字节数组发送时,一个中文字符可能会占用2~4个字节(假设为3个字节),这3个字节可能分3次接收,接收端每次接收完后用utf8编码格式转换为字符串,就会出现乱码,并导致接收长度计算错误的情况。

解决方法一:以字节数做为消息长度的计算单位,而不是字符个数。

解决方法二:发送方和接收方都采用unicode编码格式。

问题3、长连接的保活问题

标准TCP层协议里把对方超时设为2小时,若服务器端超过了2小时还没收到客户的信息,它就发送探测报文段,若发送了10个探测报文段(每一个相隔75S)还没有收到响应,就假定客户出了故障,并终止这个连接。因此应对tcp长连接进行保活。

以下是异步通信时会遇到的问题:

问题4、缓冲区脏数据问题

同步发送的拷贝,是直接拷贝数据到基础系统缓冲区,拷贝完成后返回;

异步发送消息的拷贝,是将Socket自带的Buffer空间内的所有数据,拷贝到基础系统发送缓冲区,并立即返回;

因此异步发送时缓冲区设置不好会导致接收到脏数据的问题,如下所示:

第一次发送数据:1234567890

第一次接受数据:1234567890

第二次发送数据:abc

第二次接受数据:abc4567890

请参考:http://www.cnblogs.com/tianzhiliang/archive/2010/09/08/1821623.html

解决方法一:将缓冲区的大小设置为实际发送数据的大小。

问题5、内存碎片问题

频繁的申请缓冲区会导致内存碎片的问题。

解决方法一:使用对象池和内存池。

请参考MSDN:http://msdn.microsoft.com/zh-cn/library/bb517542(v=vs.100).aspx

http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.socketasynceventargs(v=vs.100).aspx

问题6、乱序问题

多个线程使用异步通信方式向同一个接收端(socket)同时发送数据,会导致接收端接收的数据混乱。如下所示:

线程1第一次发送:123456789,假设未发送完,只发送了123

线程2第一次发送:abcdefgh,假设未发送完,只发送了abc

线程1第二次发送:456789,发送完成

线程2第二次发送:defgh,发送完成

接收端最终接收的数据为:123abc456789defgh。

解决方法一:一个连接的发送端线程排队发送数据。

Tcp编程常见问题及解决方法总结的更多相关文章

  1. NHibernate常见问题及解决方法

    NHibernate常见问题及解决方法 曾经学过NHibernate的,但是自从工作到现在快一年了却从未用到过,近来要巩固一下却发现忘记了许多,一个"in expected: <end ...

  2. C#用ado.net访问EXCEL的常见问题及解决方法

    C#用ado.net访问EXCEL的常见问题及解决方法,除了像sql server,access常见的数据库,其实Excel文件也可以做为数据库访问. ado.net访问excel的实例: OleDb ...

  3. Nacos 常见问题及解决方法

    Nacos 开源至今已有一年,在这一年里,得到了很多用户的支持和反馈.在与社区的交流中,我们发现有一些问题出现的频率比较高,为了能够让用户更快的解决问题,我们总结了这篇常见问题及解决方法,这篇文章后续 ...

  4. 对于使用progisp软件进行ISP编程时进入不了编程模式的解决方法

    标题: 对于使用progisp软件进行ISP编程时无法进入编程模式的解决方法 作者: 梦幻之心星 347369787@QQ.com 标签: [progisp, 软件] 目录: 软件 日期: 2019- ...

  5. 安装scrapy框架的常见问题及其解决方法

    下面小编讲一下自己在windows10安装及配置Scrapy中遇到的一些坑及其解决的方法,现在总结如下,希望对大家有所帮助. 常见问题一:pip版本需要升级 如果你的pip版本比较老,可能在安装的过程 ...

  6. BCP SQL导出EXCEL常见问题及解决方法;数据导出存储过程

    一.‘xp_cmdshell’的启用 SQL Server阻止了对组件‘xp_cmdshell’的过程‘sys.xp_cmdshell’的访问.因为此组件已作为此服务嚣安全配置的一部分而被关 闭.系统 ...

  7. python&django 常见问题及解决方法

    0.python-dev安装(ubuntu) apt-get install  python-dev 1.Open(filename,mode) 报错实例: f = open('d:\Users\16 ...

  8. mysql错误:Can’t create TCP/IP socket (10106) 解决方法

    错误描述 “mysql错误:Can’t create TCP/IP socket (10106)”,目测是socket端口被占用的原因,然后在打开tomcat,报的错误中也包含了“socket”,再一 ...

  9. AppFuse 3常见问题与解决方法

    非常长一段时间没做SSH项目了.近期抽出时间看了一下升级到3.x的appfuse,对新版本号使用过程中出现的一些问题进行了排查.汇总例如以下.以备后用.本文原文出处: http://blog.csdn ...

随机推荐

  1. mysql用一个表更新另一个表的方法

    Solution 1:  修改1列(navicate可行) update student s, city c set s.city_name = c.name where s.city_code = ...

  2. Selenium Webdriver——AutoIt和robot实现右键另存

    方案如下: 1.selenium 弹出右键菜单 2.robot选择相关菜单 3.调用autoIt实现windows gui另存操作 test case 如下: 1.打开百度(谷歌浏览器) 2.选择百度 ...

  3. 43.国际化-app级别的资源文件

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 在src目录下建立两个资源文件,取名为myapp_en_US.propert ...

  4. DrawGrid DrawFocusRect

    http://docwiki.embarcadero.com/CodeExamples/XE7/en/GridLineWidth_%28C%2B%2B%29 void __fastcall TForm ...

  5. VB指针操作和消息钩子

    二.VB怎么用指针       要想弄明白VB怎么使用指针,就必须要弄明白两件事,第一,如何取得数组的指针,第二,如何将指针所指向的数组取出来.       A.在讲解这两个问题之前,我们需要了解几个 ...

  6. Linux Tomcat8 访问管理页面 403 Access Denied

    http://blog.csdn.net/u012167045/article/details/61624226 1:修改conf/tomcat-users.xml配置文件 2:vi /usr/loc ...

  7. spring mvc请求参数中文乱码解决方案

    POST 请求 在web.xml中加上增加过滤器 <filter> <filter-name>encodingFilter</filter-name> <fi ...

  8. Create a Basic Shader in Shader Forge

    [Create a Basic Shader in Shader Forge] 1.打开ShaderForge.Window-> Shader Forge.(打开速度较慢) 2.通过NewSha ...

  9. IronPython Architecture

    [IronPython] IronPython is an implementation of the Python programming language written by the CLR t ...

  10. 015年传智播客JavaEE 第168期就业班视频教程15-模块规范化

    注册功能最起码得有个用户名和密码吧. bigint相当于Java里面的Long.Long型最大的那个数字是19位,我们这里是20位,绝对够用. userName长度预留20%,让它后期可扩展.6-12 ...