我写的SOCKET通信为什么在千兆网络下传输速率只有30M/秒?分别测试了BUFFER,发现不同BUFFER,在8K时速度最大,是30M左右,着急啊!怎样提升速度啊?server:
这是服务器接收数据线程DWORD WINAPI Socket_Client(PVOID pvParam)
{
std::cout<<"this is the first thread"<<std::endl; char recvbuf[BUF_LEN]; SOCKET *sockClient;
sockClient = (SOCKET *)pvParam; DWORD dwStart,dwEnd;
DWORD dwLen = 0;
dwStart = GetTickCount(); 
int nRet;
while (TRUE)
{
while(m_nLeft > 0)
{
nRet = recv(*sockClient,recvbuf + (BUF_LEN - m_nLeft),m_nLeft,0);
if(nRet == SOCKET_ERROR)
{
int nError = GetLastError();
if(nError == 10035)
{
// std::cout<<"收到数据发生异常 缓冲区满 error:"<<nError<<std::endl;
}

continue;
}
else
{
m_nLeft -= nRet;
}
}
if(m_nLeft == 0)
{
m_nLeft = BUF_LEN;
}
// std::cout<<"收到数据,内容为:"<<recvbuf<<std::endl; }
dwLen = dwLen/1024/1024;
dwEnd = GetTickCount();  char cInfo[BUF_LEN];
memset(cInfo,0,BUF_LEN);
DWORD dwSecond ;
dwSecond = (dwEnd - dwStart)/1000;
sprintf(cInfo,"用时%d秒,每秒%dM",dwSecond,dwLen / dwSecond);
std::cout<<cInfo<<std::endl; return 0;

}client://设置连接ip地址和端口
DWORD dwIP = 0;  
char cServerIp[20];
memset(cServerIp,0,20);
std::cout<<"请输入服务器IP"<<std::endl;
std::cin>>cServerIp;
dwIP = inet_addr(cServerIp);
sockaddr_in local;
SOCKET CLient_Socket;
local.sin_family = AF_INET;
local.sin_port = htons(SERVER_PORT);
local.sin_addr.S_un.S_addr = dwIP;
CLient_Socket=socket(AF_INET,SOCK_STREAM,0);
//连接服务器
if(connect(CLient_Socket,(LPSOCKADDR)&local,sizeof(local)) < 0)
{
closesocket(CLient_Socket);
std::cout<<"连接服务器失败。"<<std::endl;
return 0;
}

unsigned long    ul=1;
int              nRet;
nRet = ioctlsocket(CLient_Socket, FIONBIO, (unsigned long *)&ul);// t the unblock mode.
if(nRet < 0)
{
std::cout<<"设置SOCKET为非阻塞模式失败"<<std::endl;
}
char recvbuf[BUF_LEN];
memset(recvbuf,55,BUF_LEN);
//for(int i = 0 ; i < 1000000 ; i++)
while(true)
{
        if (send(CLient_Socket,recvbuf,sizeof(recvbuf),0)==0){
closesocket(CLient_Socket);
std::cout<<"发送数据失败"<<std::endl;
break;
        }      
}

解决方案 »

  1.   

    从代码看没有啥问题。
    1000M网络实际传输能力为600-800Mbyte/s,你的30M/s=30*8Mbyte/s已经很不错了。
      

  2.   


    1000M bps每秒比特
    你用 UDP 传输就要快点了。
      

  3.   

    本帖最后由 wenxy1 于 2008-11-17 12:27:15 编辑
      

  4.   

    1000Mb/s大约是100MB/s,实际30MB/s很正常。
      

  5.   

    tcp有流量控制,如果接收方处理慢,就会限制流量
    所以接收方只接受,收完了啥也不做,试试能不能加快速度另外可以分多进程,2个发送进程2个接受进程,看看总速度能否加快
      

  6.   

    有可能是磁盘IO的瓶颈,你直接发送数据,C和S都不要操作文件,看看。
      

  7.   

    30MBps吧?这个问题涉及几个方面:
    1,跟数据源的获取速度,也即是IO速度有关
    2,千兆网最高的传输速度是125MBps(1000Mbps),除开协议开销,速度程序用到的速度是达不到125MBps的
    3,还跟传输介质有关,要达到1000Mbps,对传输介质的要求也比较高,要符合千兆网的规范
    所以传输达到30MBps左右的话算是比较正常的了
      

  8.   

    看看,不错。
    -----------------------------------------------
    http://www.wantsoft.com
    隐形者软件代码交流博客
    -----------------------------------------------