问题描述:
现在准备用C#开发一台数据接收服务器(高速、海量的数据、对实时性要求高且不能丢包,数据包格式为定义好的结构体)。数据源(发送数据的服务器)服务器端程序由C/C++开发。数据接收服务器与数据源服务器之间用TCP Socket通信。
接收数据时有两种方式,第一种是把接收到的C++结构体,转换为C#对应的结构体形式,网上有转换参考代码,这里不详细说。第二种是读取数据包的字节,然后转换为相应的数据类型,比如,在C++语言结构体中第一个字段为int型(占四个字节),在C#中转换时,从接收到的结构体字节数组中读取4个字节,然后强制类型转换为int型,以前做股票程序时,这种方式我用过,确实可行。
提问:以前两种用C#接收数据的方式哪一种效率更高(即对CPU的性能损失较少;不会导致数据接收缓冲区内积累大量的数据来不及处理而发生丢包现象),或都哪位朋友有更好的建议?我的看法是两种速度差不多,因为都是在内存进行处理的,不过接下来几天我会拿两者做压力测试,自己求证一下。但我是希望高手给我分析一下,不胜感激。
再提问:有没有办法控制TCP连接中,数据接收缓冲区的大小?
期望高手的回答。
第一种要高,因为机器硬件目前一般都是32位或者64位的,批量拷贝肯定比一个字节一个字节的拷贝和转换要快很多。
C# 中 数据接收缓冲区是通过 ReceiveBufferSize 来调整的,你用 C/C++ 不知道你是通过什么方式来做,是直接调用 socket 的 windows api 呢,还是用 C++ 封装好的类,所以暂时无法回答你第二个问题。