我目前的一个项目要求如下:
(1)两台机子,一个Client,一个Server,采用TCP/IP协议。
(2)数据量 500K/100ms。
我采用的编程方式:
(1)Server、Client都采用异步方式。
(2)Client缓冲区设为500K,采用无延迟方式进行数据申请,每次发送10个字节到Server,Server收到后立即送回500k数据,Server 采用关闭缓冲区接收。
(3)Server采用专门的发送线程,如下
DWORD WINAPI SendThread (PVOID)
 {
    unsigned long nGoCode;
    while (1) 
{
        nGoCode = WaitForSingleObject (g_hSendEvent, INFINITE);
        if (nGoCode == WAIT_OBJECT_0) 
{
            if (!fContinue)
                break; int idx = 0;
int LeftData_FutureRead = 512012;
while( LeftData_FutureRead > 0 )//接收数据
{
int TheData_ReadOneTime = send(m_hClientSocket, &DeliverMessage[idx], LeftData_FutureRead, 0 );
if (TheData_ReadOneTime != SOCKET_ERROR)
{
idx += TheData_ReadOneTime;
LeftData_FutureRead -= TheData_ReadOneTime; 
}
}  } 
else
            break;
    }
    return 0;
}
(4)Client采用类似接受方式:首先接受到数据头(自己定义)
while( LeftData_FutureRead > 0 )//接收数据
{
        int TheData_ReadOneTime = recv( m_hSocket, &Data_CurrentLine[Current_ReceiveTimes].WholeLine_Point[idx], LeftData_FutureRead, 0 );
if (TheData_ReadOneTime != SOCKET_ERROR)
{
idx += TheData_ReadOneTime;
LeftData_FutureRead -= TheData_ReadOneTime; 
}
}
(5)连续工作大约40次,(要求至少连续工作100次)就不能正常工作,出现问题。请各高手指点一下!!多谢。

解决方案 »

  1.   

    请大家帮忙分析一下,有没有实现的可能,我看到以前的帖子说从一台机子到另一台机子,如果采用TCP/IP,发送时延最小也要100ms,如果那样,我的项目就无法实时实现了,只能后续处理了。我说的连续工作40次,是指Client能连续接收40次数据,但是不是每次100ms内完成,我还无法确定。
      

  2.   

    可以实现,你多试几次,多看看msdn.
      

  3.   

    netgm(问题多多) :是内网
    wwwllg(wwwllg):我尝试了可能的几种组合,可总是到40几次后即不能工作了,收不到数据,请给与指点,多谢!
      

  4.   

    netgm(问题多多) :是内网
    wwwllg(wwwllg):我尝试了可能的几种组合,可总是到40几次后即不能工作了,收不到数据,请给与指点,多谢!
      

  5.   

    可以粗略的计算一下,如果你的网速是10m,那么每毫秒可以发送12byte,100ms能发送1.2K.如果是100m,那么可以发送12k肯定不能在100ms之内发送500k呀你的问题是快发送端和慢接收端造成。你的发送端,由于没有接收到慢接收端的ack,所以发送窗口很快就堆满了,当然出错
      

  6.   

    nuaawenlin(飘人) :从你的计算来看,那是真的不行了,看来只能后续处理了,但我曾经对只发送一次申请和一次接收的时间周期进行计算过,大约是76.5ms左右。
    程序如下:
    Client:
    PostMessage(WM_SEND_REQUEST,0,0);//向服务器申请数据
    QueryPerformanceFrequency(&litmp); 
    dfFreq = (double)litmp.QuadPart; 
    QueryPerformanceCounter(&litmp); 
    QPart1 = litmp.QuadPart; // 获得初始值当从服务器接收到全部数据后:
    GetFullData_FromServer();//接受及处理函数500K
    QueryPerformanceCounter(&litmp); 
    QPart2 = litmp.QuadPart;// 获得终止值 
    dfMinus = (double)(QPart2-QPart1); 
    dfTim = dfMinus / dfFreq; // 获得对应的时间值,单位为秒//显示上面计算时间周期
    CString Cycle_Times;
    Cycle_Times.Format("Times = %f ms",dfTim*1000.0);Times = 76.5 ms大约连续测量10次,都是这样的数值。我不能确认这样计算是否合理?如果合理,原因在哪里呢?
      

  7.   

    大家帮帮忙没,类似的问题以前的确有过探讨,但一般没有这么短时间的要求,如果时间放大到500K/200ms,有希望吗?
      

  8.   

    500K/200ms
    好像是不太可能实现的。
      

  9.   

    1000M网卡?价格是多少?这个我还真不知道,谢谢lianglp() 和loseme915(郁闷) ,但我的测试结果为什么是76.5ms呢?看来我测试错了。
      

  10.   

    可以粗略的计算一下,如果你的网速是10m,那么每毫秒可以发送12byte,100ms能发送1.2K.
    如果是100m,那么可以发送12k这个怎么算出来的?10M网速,上行和下传宿舍怎么算的?
      

  11.   

    nuaawenlin(飘人) 计算错了,
    10M网卡的速度是 10M bit/s 换算成 ms 是 10K bit/ms,把bit换算成byte是 1.25K byte/ms;
    也就是说 1.25K byte/ms × 100 = 125K byte/100ms ,在100M的网卡上就是 1.25Mbyte/100ms;
    上面说的是理论速度,实际速度达到一半还是没有问题的。试试不用异步模式,直接在循环里等待数据,收到数据就发送。
    for (;;;)
    {
      recv(...);    //使用阻塞模式的网络函数时会停在这里不动,直到有数据到来。
      send();       //如果速度还达不到,就开个新线程来发送数据,并且不用等待线程结束。
    }
      

  12.   

    客户的收不到数据可能是由于TCP的发送缓冲区被灌满了,网卡的发送速度过慢。换张质量好点的网卡是可行的。
    主板集成的网卡就不要用了。
      

  13.   

    1。tcp传输数据有一个瓶颈,单socket传输的稳定流量要控制在64K/s以下 如果超过64K 很快你的SOCKET就会被断开 去看看FTP的下载也是用TCP 看看他的流量在1
    M要开多少个SOCKET 
    2。TCP传输一个包的数据如果10个字节 路由器会给你合包的!也就是说 不一定你发一个请求包,服务器端就接受到,可能等待几个包合为一个包发到服务器端,发tcp的包最好要100个字节以上,即使你不用这么多,加一些垃圾数据也好!
    3:这个需求可以做,开多个SKOKET 自己写一个算法控制一下就好了!