最近在写一个类似飞鸽传输的软件,因为感觉使用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);
}
}

解决方案 »

  1.   

    cSocket.SetSockOpt(SO_RCVBUF,(char*)&ntg->per,sizeof(ntg->per),SOL_SOCKET); 
    cSocket.SetSockOpt(TCP_NODELAY,&delay,sizeof(delay),IPPROTO_TCP); 不用设置CSocket很快的,如果是局域网,应该是最快的方案!
      

  2.   


    确定一下你的网络,10M位 还是 100M位 的?
    如果是 10M 的网络,理论速度是 1.25M字节
      

  3.   

    你这里把两个毫不相干的慢操作放一起,必然会造成慢的。如果要把网络收到的数据写文件,应该把写文件和网络收发放两个线程,这样才能最大速度的利用资源。否则你写文件时网络收发旧停了,在局域网情况下,磁盘读写比网络还慢,不慢才怪再说,1M/s如果是字节单位,相当于人家常说的10M带宽,也属于非常快了
      

  4.   

    没有考虑检校位,发送一字节需要9-10bit
      

  5.   

    使用winsocket的TransmitFile可以达到最快的速度.
    1:它使用异步IO.
    2:内核直接处理文件,省掉了ring3/ring0之间的来回拷贝.这是目前最高效的做法了.请参考 零拷贝 技术.
      

  6.   

    楼上的大哥,TransmitFile传送后如何接受啊,可以使用CSocket来接受么?能不能给点代码