要求是:
1.两台机器(A,B)安装Win2k/2003的PC机,千兆网卡,用交叉网线直接连接
2.数据是A机向B机单向发送,持续时间需20分钟,每秒需要发送1500-2000个数据包,每数据包长度固定,8472个字节,且每个数据包头4个字节是固定值
3.要求数据包丢失率在千分之一以下,不要求必须按顺序接收到我目前是采用CAsyncSocket类,TCP传输方式,B机起监听线程,两机器SNDBUF和RCVBUF均设为9000,TCP_NODELAY,同时在注册表里面将两机器MTU设定为9000是,收到的TCP包如果前4个字节不是那固定值就丢弃但是实验的结果是基本上要丢掉10-15%的数据包,请问原因会出在哪里呢,机器配置肯定是不成问题的,3.2G的双Xeon,4G RAM

解决方案 »

  1.   

    CAsyncSocket的效率不高啊。
    得研究WinSock其他的模型了。
      

  2.   

    一般都是用WINSOCKET,相信没几个人会直接用MFC提供的类.用原始的SOCKET,可以自己调整性能.
      

  3.   

    TCP是不可能丢包的,是你处理的方法不对。
    允许丢包而且不考虑接收顺序的话用UDP最合适。
      

  4.   

    因为你是单向发送
    你可以改为:B接收到判断后再通知A发送下一包
    或者你不用判断,TCP连接是可靠的连接,只是在处理接收数据时,还是要小心了,是你程序自己丢了包,不要错Guai了网络
      

  5.   

    如果考虑效率,用UDP,否则用TCP。
    最好直接用Socket API封装罢了。
      

  6.   

    改用SOCKET API之后,丢包数降为千分之X(而且是在不进行前4字节判断的情况下),但是仍嫌略高,难道必须要改成UDP的才好?SND_BUF和RCV_BUF以及MTU应该怎么设更好一些呢?
      

  7.   

    不知道楼主的丢包率如何计算?是否判断了成功发送这个环节?一般SOCKET的缓存只有64KB,如果你的处理速度小于发送速度,SOCKET缓存写满了会丢包,建议你检查检查接收部分,只做记数处理不进行任何操作,记数完就丢弃,测试一下性能。
      

  8.   

    目前我接收端的处理很简单,开了两个8472000大小的buffer,收到的8472字节的数据就往一个buffer里面写,写满了将这8M左右的数据写盘(写盘是另一个thread),并换另一buffer.
    个人认为这个操作在这种配置(磁盘也是raid5)应该不会跟不上发包速度吧
    SOCKET的buffer最大能够开多少?
      

  9.   

    你调用send之后要检查返回值是不是等于你要发送的字节数,如果没有全部发送掉,要继续发送,直到发完为止,否则的话你的数据包就不完整了,导致数据丢失。
    接收的时候你可以直接用那个8472000的buffer去收,像这样:int size = 0;
    while(size != 8472000)
    {
      int len = recv(socket, buffer + size, 8472000 - size, 0);
      if(len == SOCKET_ERROR)
       return;
      size += len;
    }
    SwitchBuffer();
    WriteToFile();
      

  10.   

    另外SOCKET的缓存默认都是合理值,没有必要去改,改的不好反而影响性能。