recv接收数据的问题,在线等。急!!!

lingzhi_ma 2006-12-12 01:01:48
我写的服务程序是发现当接受大约6000字节的时候,接收需要10ms。而当发送60字节的时候需要200ms,不知道为什么?急!!
服务端和客户端分别运行在两台机器上,会出现上述情况,若运行在同一台机器上则不会出现上述情况。
发送和接受都是每次发送512字节,接收时也是每次接收512字节。直到接收完成为止。
以下是接收的代码

接收代码如下:
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不知道为什么?
盼高手答复

...全文
430 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lingzhi_ma 2006-12-12
  • 打赏
  • 举报
回复
如果想提高效率就换一个IO模型吧,重叠IO或者完成端口都可以在很大程度上提高"效率"的。

有没有完成端口或者重叠io的例子。我用的是事件选择模型。也想试图换个IO模型,可水平有限。请赐教!若有的话可以发到我的邮箱里malingzhi@gdzhishen.com
谢谢
ProgrameMan 2006-12-12
  • 打赏
  • 举报
回复
我是n个线程同时发送数据,一个线程接受数据请求,然后把请求缓存起来,同时服务器这测又有n个线程去读取缓存中的请求,处理请求,回复结果。出现了我说的那种情况。不知有没有办法提高效率。
望指教!

*************************************************************
如果想提高效率就换一个IO模型吧,重叠IO或者完成端口都可以在很大程度上提高"效率"的。
但是这些模型相对复杂一点。
ProgrameMan 2006-12-12
  • 打赏
  • 举报
回复

楼上的两位大虾为什么不里小弟了,盼指教呢
********************************************
答:我是因为在下班回家的路上,公车上没有电脑更没有宽带 呵呵
ProgrameMan 2006-12-12
  • 打赏
  • 举报
回复
两个线程完成同一个工作的时间 正常情况下都会大于 单线程连续做两次的?那多线程操作在一些情况下还不如单线程操作呢!是么?
*****************************************************************
答:是的

怎样才能在多线程下提高效率呢?我只是多线程发送,单线程接受,
*************************************************************
在多线程中提高的是"效率"不是你所理解的效率(注意是加引号的效率),举个例子你应该就明白了,

你的服务器就一个线程,处理一个用户的请求需要花费 1秒钟,那么你处理100个用户的请求就需要100秒,这是很容易得到的结论

然而你的服务器采用5个线程,每一个线程处理一个用户请求需要1.1秒,那么你处理100个用户的请求是多少秒呢? 看出“效率”来了吗?


顺便问句怎么给分!呵呵!见笑了
************************************************************
答:点击帖子右上角的 管理,然后再密码框输入密码,然后再每个你要给分人的输入框里输入分值,然后点击给分按钮。

呵呵
lingzhi_ma 2006-12-12
  • 打赏
  • 举报
回复
楼上的两位大虾为什么不里小弟了,盼指教呢。
lingzhi_ma 2006-12-12
  • 打赏
  • 举报
回复
我是n个线程同时发送数据,一个线程接受数据请求,然后把请求缓存起来,同时服务器这测又有n个线程去读取缓存中的请求,处理请求,回复结果。出现了我说的那种情况。不知有没有办法提高效率。
望指教!
lingzhi_ma 2006-12-12
  • 打赏
  • 举报
回复
两个线程完成同一个工作的时间 正常情况下都会大于 单线程连续做两次的?那多线程操作在一些情况下还不如单线程操作呢!是么?
怎样才能在多线程下提高效率呢?我只是多线程发送,单线程接受,
顺便问句怎么给分!呵呵!见笑了
blastzgd 2006-12-12
  • 打赏
  • 举报
回复
另外,系统做线程调度也是需要一定的CPU指令周期的.
blastzgd 2006-12-12
  • 打赏
  • 举报
回复
这个取决于你的单次处理中的CPU占用率和你的线程同步管理效率.
ProgrameMan 2006-12-12
  • 打赏
  • 举报
回复
两个线程完成同一个工作的时间 正常情况下都会大于 单线程连续做两次的,因为线程要涉及同步、上下文交换什么的,他的代价比较高。所以是正常的
lingzhi_ma 2006-12-12
  • 打赏
  • 举报
回复
多谢呀!我式过了正是这个问题。
但是又有新的问题出现:就是在测试过程中我发现当客户端单线程发送时服务器接收请求然后作处理,回复请求需要1000s钟的话。若当客户端多线程处理时(比如开2个线程同时发送请求到服务器端),则就需要2003s,开十个线程线程和开两个的线程效果一样。
不知为什么!请求赐教。
万分感谢各位大虾的帮忙
blastzgd 2006-12-12
  • 打赏
  • 举报
回复
关闭Nagle
设置选项TCP_NODELAY
ProgrameMan 2006-12-12
  • 打赏
  • 举报
回复
你出现这种情况我认为是正常的 TCP 默认采用了nagle算法,也就是说当你发送60字节时,系统会等待一段时间(因为缓冲区没满)一般在 0.1 到 0.2 秒之间,他等待这段时间是为了更好的利用网络,比如你连续发送两个60字节的数据,他会一次给你都发过去的,而你发送6000字节时,缓冲区满了,它就不等了立即发送,我说的有点乱,你可以看看 nagle算法的,如果你想必免这种现象也是可以的只有关闭 nagle算法就可以了,具体如何关闭你到 google上查 nagle 就可以找到
lingzhi_ma 2006-12-12
  • 打赏
  • 举报
回复
哪位大虾帮忙解决一下呀!问题困扰好长时间了。
在此谢过了
myfriend023 2006-12-12
  • 打赏
  • 举报
回复
帮顶
lili830209 2006-12-12
  • 打赏
  • 举报
回复
搬个板凳听!

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧