为什么winsock编程中接收缓冲区不会因为接收函数recv()的调用而更新?
用如下代码接收,当对方发送一串字符,程序在循环过程中
将可以重复的收到该字符串,而且,当对方再发一新字符串
时,接收到的是两个字符串的总和,似乎是接收缓冲区一直
没有因为recv()函数的调用而更新
char buf[1024];
int rval,len;
do{
memset(buf,0,sizeof(buf));
if(rval=recv(msgsock,buf,1024,MSG_PEEK)>0)
TRACE("reading stream message");
if(rval==0)
TRACE("ending connection\n");
else
TRACE("-->%s\n",buf);
send(msgsock,"OK",4,MSG_DONTROUTE);
}while(rval!=0);
问题点数:50、回复次数:5Top
1 楼yinyu(阴雨)回复于 2000-09-02 19:57:00 得分 50
recv函数的最后一个参数如果用MSG_PEEK表示“偷窥”数据,也就是取走数据但并不从系统接收缓冲去中删除,正常的调用该参数设为0即可Top
2 楼kirk(kirk)回复于 2000-09-03 10:37:00 得分 0
yinyu说得对!Top
3 楼sword_hero(sword)回复于 2000-09-04 06:46:00 得分 0
是的Top
4 楼killjapan05(ff)回复于 2000-09-04 08:17:00 得分 0
我也曾碰到这种情况!我记得recv()中,0就是MSG_PEEK;
我是把它设置为0,但若服务器连续发送send(),还会出现这情况。
我解决的方案就是在send()后加一个sleep(1);
不是方法的方法。我想这原因大概是windows消息响应太慢的原因吧!
你也是用异步socket吧!Top
5 楼a8e(坎坷的菜贩)回复于 2000-09-04 12:57:00 得分 0
错!查查相关头文件!MSG_PEEK = 2!
recv最后一个参数应为0。
Top




