我写的服务程序是发现当接受大约6000字节的时候,接收需要10ms。而当发送60字节的时候需要200ms,不知道为什么?急!!
服务端和客户端分别运行在两台机器上,会出现上述情况,若运行在同一台机器上则不会出现上述情况
服务端和客户端分别运行在两台机器上,会出现上述情况,若运行在同一台机器上则不会出现上述情况
解决方案 »
- 怎么能让所有的文件都包含某个头文件?
- vc6自动调试本机运行出错的任何应用程序
- 如何用Messagebox 显示一个 int 型 变量内容
- 请问树控件如何使一个没有子节点的节点前面可以显示一个加号
- realsdk 看了好长时间,不得要领??????
- 如何打包文件夹?
- 大侠,我的语句有什么错?CArray<CPoint,CPoint> m_pointArray;在线结帐!!!
- 我在CView.h里声明了一个画笔,我想在CDoc.cpp里引用,如何实现??
- 如和用OpenGL显示字符串?
- 十万火急,关于CRichEditView的SetFont的问题
- 利用VC打造自己的资源浏览器
- 急!!请教高手视图界面如何在初始化时最大化????
int sockRecvData(unsigned int& Sock,char* precvbuf,long Data_Length)
{
int rval=0;
SOCKET sock=(SOCKET)(Sock);
char receivebuf[NORMALBUFFERSIZE]; //接收数据的缓存
long Data_Count = 0; //收到的数据总量
int recvBuf_Length = 0; //单次收到的数据量
WSAEVENT event = ::WSACreateEvent();
::WSAEventSelect(sock, event,FD_READ);
long recvstarttime=GetTickCount();
int nRet = ::WaitForSingleObject(event, WAIT_FOR_RECV_TIME);//5*1000);
if(nRet == WSA_WAIT_TIMEOUT) // 定时显式状态信息
{
printf("----ERROR:Wait For Recv Data TimeOut----\n");
rval=-4;//等待超时
}
else
{
while(1)
{
memset(receivebuf,0,sizeof(receivebuf));
int recvLength=(Data_Length-Data_Count)<NORMALBUFFERSIZE ?(Data_Length-Data_Count):NORMALBUFFERSIZE;
recvBuf_Length = recv(sock,receivebuf,recvLength,0); //接收一次数据
if(recvBuf_Length==-1) //-1,网络错误
{
int err=WSAGetLastError();
if(err==10035||err==6)
{
Sleep(5);
printf("dddddddddddddddddd\n");
continue;
}
else
{
Data_Count=-1;
break;
}
}
if(recvBuf_Length>0)
{
memcpy(&precvbuf[Data_Count],receivebuf,recvBuf_Length); //将每次收到的数据放到recvBuf中
Data_Count+=recvBuf_Length;
} //把单次收到的数据长度累加
if(recvBuf_Length==0)
{
int closeerr=WSAGetLastError();
if(Data_Count!=Data_Length)
Data_Count=-1;
break;
}
if(Data_Count == Data_Length) //收到的数据总长度等于要接收的数据总长度,跳出
break;
}
}
WSACloseEvent(event);
long recvendtime=GetTickCount();
printf("recv data used time %d\n",recvendtime-recvstarttime); return Data_Count;
}
发送时先发送个包头,然后发送内容。
结果发现当接收内容时若发送的字节数为60则会在 int nRet = ::WaitForSingleObject(event, WAIT_FOR_RECV_TIME);//5*1000);
等待大约200ms,若发送的字节数为6000则只会等待10ms不知道为什么?
盼高手答复
BOOl Val=TRUE;
setsockopt(s,IPPROTO_TCP,TCP_NODELAY,&Val,sizeof(BOOL));