我写的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;
}
}
这是服务器接收数据线程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;
}
}
1000M网络实际传输能力为600-800Mbyte/s,你的30M/s=30*8Mbyte/s已经很不错了。
1000M bps每秒比特
你用 UDP 传输就要快点了。
所以接收方只接受,收完了啥也不做,试试能不能加快速度另外可以分多进程,2个发送进程2个接受进程,看看总速度能否加快
1,跟数据源的获取速度,也即是IO速度有关
2,千兆网最高的传输速度是125MBps(1000Mbps),除开协议开销,速度程序用到的速度是达不到125MBps的
3,还跟传输介质有关,要达到1000Mbps,对传输介质的要求也比较高,要符合千兆网的规范
所以传输达到30MBps左右的话算是比较正常的了
-----------------------------------------------
http://www.wantsoft.com
隐形者软件代码交流博客
-----------------------------------------------