我看到其他网友说使用完成端口建立的程序在数据通讯时CPU的占用率比较少的我的CPU是p42.0的
写的完成端口的服务器,客户端是使用vb建立的程序
目的是vb的客户端发送的数据将通过服务器转发到另一个client(也是vb写的,其实就是和前面说的是
一个程序);这是在本地测试的,就是两个client和服务器在一台机子上,
我使用vb发送一条8k的数据,CPU占用率为10%,当连续发送时cpu占用率大幅度上升,可这仅仅是两个socket和服务器相连,当处理多个socket时,cpu能承受吗?
我的程序有问题吗?我是在完成端口的工作线程中来处理客户端发送过来的数据,并将数据解析(每一条数据中都包含了
这条数据发送方的IP,)这样在这个工作线程中将这个数据在发送到目的地,即另一个client
我的这里处理数据,以及处理数据后发送数据这些操作都是在完成端口的工作线程中进行的,
为了效率还要在这个工作线程中开辟新的线程吗?

解决方案 »

  1.   

    UDP还是TCP?
    一包数据最好不要超过1.4K
    为了节约CPU,你可以:
    1.放大Server端的发送缓冲和Client端的接收缓冲;
    2.将接收和发送放在单独的线程中处理;
    3.减少每一个接收、发送循环的数据处理量,尽快交出CPU的使用权
      

  2.   

    我用的是tcp建立的连接
    谢谢你
    请问Server端的发送缓冲是指的什么?
    是完成端口
    函数
    GetQueuedCompletionStatus()中的LPOVERLAPPED的开辟的数据空间吗?我现在开辟的是1M的空间;当每次处理的数据大于1.4k的时候要进行循环处理吗?
    你说的接受和发送方在单独的线程中,是将接受方在一个线程中,发送发在另一线程中吗?
    还是她们两者方在一个线程中?
    谢谢你
    LPOVERLAPPED
      

  3.   

    我想,应该是程序没写好.我在自己电脑上粗略的模拟测试了一下,模拟100个连接时候,发送速度大概是 3 MByte/s(包括了发送和接收,差不多相当于6 MB/s的速度了).
    服务端程序和客户端模拟连接程序都在本机运行.服务端和客户端都用"完成端口"的通信模块,运行的时候,整个系统的cpu占用率是50%左右.由于测试程序写的不是很完善,没有用到100%的cpu.但是,至少说明一点,你的程序写的有点问题.
    一般来说,单个连接发送8K的数据包,进程的cpu占用率应该几乎为0.
      

  4.   

    cpu的使用率?很多因素都会影响到他,如果你有一个其他的什么线程,一直在运行,也会提高cpu使用率。你收到数据后如何处理,这一部分才是影响cpu使用率的关键所在。从完成端口本身获得数据几乎是不怎么占用cpu的。可以肯定,cpu的使用率10%,是你编程导致的。windows建议的是一个包不要超过8k。
      

  5.   

    gwinner(动力引擎) ( ) 信誉:97 
    说是一个包建议不超过1.4k
    上楼说不超过8k
    请问这个依据是什么
    有什么书吗?
      

  6.   

    这个1.4k和8k估计是指UDP数据包吧!tcp/ip叫做 TCP_Stream , 是流,根本就没有"包的大小"这么一说.
      

  7.   

    一个建议:
    请不要在同一台机子上既开客户端又开服务器端,尽管这样可以测试逻辑,但本机测试是没有经过网卡传输的,与实际情况可能很不相符;另外,你的CPU占用率,也可能是由于处于同台机子上的客户端造成的,所以建议测试时,还是把客户端和服务器端分开来测。