socket传输速率过低
用socket传输数据
发送端为客户端C++编写 接收端为服务器端java编写
实测传输速率在0.36M/s 用飞鸽传输传送文件速度大于7M/s 可以排除网络问题
请各位大侠指点一二 看看是什么原因导致传输速率过慢
发送端代码
void __cdecl SendData(LPVOID param)
{
restart:
skVersion = MAKEWORD(2,2);
//套接字初始化
WSAStartup(skVersion,&wsaData);
hostEntry = gethostbyname(CenterIp);
//中心节点网络信息
RecverInfo.sin_family = PF_INET ;//设定网络协议
RecverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);/*inet_addr(CenterIp.GetBuffer());*/
RecverInfo.sin_port = htons(7745) ;//中心节点端口7745为接受数据端口
DataSender = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
loop:
//与接受端建立连接 DataSender需要进行连接的套接字 serverInfo网络地址
int rVal=connect( DataSender ,(LPSOCKADDR)&RecverInfo , sizeof(RecverInfo) );
//如果连接失败
if(rVal==SOCKET_ERROR)
{
//::MessageBox(NULL,_T("连接失败"),_T("Error"),MB_OK);
goto loop;
IsSend = FALSE;
}
int counter = 0;
clock_t start,finish;
//测试每两个定时器周期之间的时间
LARGE_INTEGER t1,t2,t3;
LONGLONG qt1,qt2,qt3,qt4;
LARGE_INTEGER litmp;
double freque,realtime;
QueryPerformanceFrequency(&litmp);//获得时钟频率
freque=(double)litmp.QuadPart;
//
QueryPerformanceCounter(&t1);//获得初始值
qt1 = t1.QuadPart;
while (counter<10000)//主线程结束后自动消亡
{
counter++;
//准备发送数据
unsigned long DataPackLen = 0 ;//数据包大小
unsigned long LeftDataLen = 0 ;//剩余的字节数
unsigned long SendDataLen = 0 ;//发送的字节数
//ConstructDataPack返回的是指向24个char类型的指针
SendUnit = ConstructDataPack(/*LoggerDataPtr ,rtirefname ,rtiinstname ,rtitime*/);//发送的数据
unsigned int SendOffset = 0 ;//偏移量
DataPackLen = 72;
//myDataSize = 0 ;
LeftDataLen = DataPackLen ;
unsigned int SendSoFar = 0 ;
//开始发送
do
{
do
{
if ( LeftDataLen > SEND_BUFFER_SIZE)
{
SendDataLen = SEND_BUFFER_SIZE ;
}
else
SendDataLen = LeftDataLen ;
SendSoFar = send( DataSender ,/*&attemp*/SendUnit+SendOffset ,SendDataLen ,0 ) ;//发送
//cout<<"send "<<SendSoFar<<"bytes\n";
if ( SendSoFar == SOCKET_ERROR )
{
int iErr = ::GetLastError();
TRACE("SendFileToRemoteRecipient returned a socket error\
while sending chunked file data\n\
\tNumber of Bytes sent = %d\n\
\tGetLastError = %d\n", SendSoFar, iErr );
//::MessageBox(NULL ,_T("Socket Error")+iErr , _T("Error") , MB_OK ) ;
//IsSend = FALSE ;
shutdown( DataSender , SD_SEND );//通知不再发送数据
closesocket( DataSender ) ;//关闭套接字
goto restart;
}
SendOffset += SendSoFar ;//设定偏移量
SendDataLen -= SendSoFar ;//已发送的字节数
LeftDataLen -= SendSoFar ;//剩余的字节数
} while (SendDataLen > 0);
} while (LeftDataLen > 0);
//delete [] tmpptr;
delete [] SendUnit;
SendUnit = NULL;
}
QueryPerformanceCounter(&t2);//获得初始值
qt2 = t2.QuadPart;
double currT=(double)(qt2-qt1);
double currRealT =currT/freque;//获得对应的时间值
printf("发送100000次数据包,花费时间%f\n",currRealT);
SetEvent(Event);
//return false;
}
接收端代码
import java.net.*;
import java.nio.ByteBuffer;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Vector;
import java.io.*;
public class DataRecver extends Thread {
public Vector<byte[]> bytevector=new Vector<byte[]>();
public byte[] bytes1=new byte[1024];
public int a=0;
// 本地服务器套接字
public ServerSocket MyDataRecvSvr ;
//端口号 选定端口7745
public int portNum ;
//接收端套接字
public Socket MyDataRecvSock ;
//数据输入流
public DataInputStream MyDataStream;
//constructor
public DataRecver(){
MyDataRecvSvr = null ;
portNum = 7745 ;
MyDataRecvSock = null ;
MyDataStream = null ;
start() ;//启动线程
}
//线程入口
public void run(){
try{
MyDataRecvSvr = new ServerSocket(portNum) ;//建立服务器套接字
MyDataRecvSock = MyDataRecvSvr.accept() ;//阻塞监听
InputStream is = MyDataRecvSock.getInputStream() ;//输入流
MyDataStream = new DataInputStream(is) ;//数据流
//获取数据信息
//Vector<Byte>bytes=new Vector<Byte>();
long start;
long end;
long s;
long e;
long all=0;
byte[]bytes=new byte[1024];
while(true/*IsOperating*/)
{
while(MyDataStream.available()>0)
{
int tmpsize=MyDataStream.available();
byte []tmpbytes=new byte[tmpsize];
//MyDataStream.readFully(MyBytes.bytes, 0, 10);
MyDataStream.readFully(tmpbytes, 0, tmpsize);
//MyBytes.bytes.addAll(bytes)
for(int i=0;i<tmpsize;i++)
{
MyBytes.bytes.add(tmpbytes[i]);
}
}
try {
Thread.sleep(50);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
catch(IOException e){
e.printStackTrace();
}
}
public static void main(String[] args)
{
new DataRecver();
}
}