回 帖 发 新 帖 刷新版面

主题:[讨论]CSocket的一个无法解释的问题

以下是我在响应OnReceive消息时的两种处理方法:
void OnReceive(int nErrorCode)//1
{
 int k;
 char j[100];
 do
 {
  k+=recv(this->m_hSocket,j+k, sizeof(j)/2 ,0);
 }while(k<sizeof(j));
 Send(j,sizeof(j));
}

void OnReceive(int nErrorCode)//2
{
 char j[100];
 recv(this->m_hSocket,j, sizeof(j) ,0);
 Send(j,sizeof(j));
}

从上面代码来看,应该很清楚一旦OnReceive促发,两个连接的套接字将会在死循环中,可是第一种在不确定次数循环后会断掉,不会阻塞,而第二种方法才会无休止的循环下去,请问谁能解释这个问题?  
我问了很多人都无法解释,希望这个论坛不要然我失望!

回复列表 (共5个回复)

沙发

你的代码没有写完整吧?k都没有初始化,下面一个函数也不是循环,sizeof(j)/2总是50,k值不停加会溢出,你这代码....简直乱七八糟......

板凳

第一个函数的int k;应该是int k=0;这一句忘记写了,不好意思。

楼上应该没有理解我的意思,我的意思是,让两个套接字连接,一个套接字先发一个数据包过去,再促发对方套接字的OnReceive函数,然后对方的OnReceive函数的代码就在以上,对方在收到100个字节后,马上又发送100个字节过来,这一边再进行同样的处理,让这两个套接字处于一个死循环状态,可是第一种方法在不确定次循环后断掉,第二种则可以,请问这是为什么?

3 楼

do
 {
  k+=recv(this->m_hSocket,j+k, sizeof(j)/2 ,0);
 }while(k<sizeof(j));


当k>50就溢出了啊

4 楼

怎么溢出了?
recv(this->m_hSocket,j+k, sizeof(j)/2 ,0);
看清楚了,数组j大小是100,而且k不可能大于100,怎么溢出?

5 楼

晕啊,k>50就溢出了啊。。。如果k>50,j+k>j+50是缓冲区起点位置,而缓冲区大小为50,还没溢出啊?

>50+50 是不是>100啊???

我来回复

您尚未登录,请登录后再回复。点此登录或注册