最近在写一个类似飞鸽传输的软件,因为感觉使用API进行套接字操作太麻烦,便直接用了CSocket来进行局域网传输,可是速度却很慢,只有1m/s,直接本机开两个程序传速度很快,是不是和网络分包大小为8k有关呢,我把缓冲区大小设的是200k。下面为部分代码,望高手指点一下速度慢的原因。呵呵,只想使用CSocket,所以请不要说使用API,谢谢啦。
AfxSocketInit();
CSocket sSocket;
//绑定到本机6666端口并开始监听。
sSocket.Create(6666);
sSocket.Listen();
CSocket cSocket;
sSocket.Accept(cSocket);
cSocket.SetSockOpt(SO_RCVBUF,(char*)&ntg->per,sizeof(ntg->per),SOL_SOCKET);
int delay=0;
cSocket.SetSockOpt(TCP_NODELAY,&delay,sizeof(delay),IPPROTO_TCP);
cSocket.SetSockOpt(SO_DONTROUTE,&delay,sizeof(delay),SOL_SOCKET);
CFileDialog fileDlg(false);
CFile *cf;
if(fileDlg.DoModal()==IDOK){
cf=new CFile(fileDlg.GetPathName(),CFile::modeCreate | CFile::modeWrite);
//声明一新套接字用来接受来自客户端数据,服务器套接字接受该套接字
TCHAR tch[ntg->per];
int num=1;
while (num)
{
num=cSocket.Receive(tch,ntg->per);
cf->Write(tch,num);
}
}
AfxSocketInit();
CSocket sSocket;
//绑定到本机6666端口并开始监听。
sSocket.Create(6666);
sSocket.Listen();
CSocket cSocket;
sSocket.Accept(cSocket);
cSocket.SetSockOpt(SO_RCVBUF,(char*)&ntg->per,sizeof(ntg->per),SOL_SOCKET);
int delay=0;
cSocket.SetSockOpt(TCP_NODELAY,&delay,sizeof(delay),IPPROTO_TCP);
cSocket.SetSockOpt(SO_DONTROUTE,&delay,sizeof(delay),SOL_SOCKET);
CFileDialog fileDlg(false);
CFile *cf;
if(fileDlg.DoModal()==IDOK){
cf=new CFile(fileDlg.GetPathName(),CFile::modeCreate | CFile::modeWrite);
//声明一新套接字用来接受来自客户端数据,服务器套接字接受该套接字
TCHAR tch[ntg->per];
int num=1;
while (num)
{
num=cSocket.Receive(tch,ntg->per);
cf->Write(tch,num);
}
}
cSocket.SetSockOpt(TCP_NODELAY,&delay,sizeof(delay),IPPROTO_TCP); 不用设置CSocket很快的,如果是局域网,应该是最快的方案!
确定一下你的网络,10M位 还是 100M位 的?
如果是 10M 的网络,理论速度是 1.25M字节
1:它使用异步IO.
2:内核直接处理文件,省掉了ring3/ring0之间的来回拷贝.这是目前最高效的做法了.请参考 零拷贝 技术.