刚开始学习VC,做一个客户端和服务端winsock通信的程序,多进程登陆实现动态认证出现的问题是,客户端每次都将服务端收到的随机数累加,比如,第一个用户登陆后收到的是542,第二个用户登陆后就收到了542863
第三个用户则是542863826....自己调试发现服务端没有累加重复发送部分客户端代码如下
SOCKET ConnectSocket(char* IpAddress,UINT Port)
{
//建立sock
sockaddr_in  socketAddress;
HOSTENT *hp;
int nAddrLen;

WSADATA wsaData;
if(WSAStartup(WINSOCK_VERSION,&wsaData))
return  0;
hp=gethostbyname(IpAddress);
memcpy((char*)&socketAddress.sin_addr, (char*)hp->h_addr, hp->h_length);
socketAddress.sin_family=AF_INET;
socketAddress.sin_port=htons(Port);
nAddrLen = sizeof(socketAddress);
SOCKET sock = socket(AF_INET,SOCK_STREAM,0);
if(sock==INVALID_SOCKET)
return false;
int connected=connect(sock,(sockaddr*)&socketAddress,nAddrLen);
if(connected)
return 0;
return sock;
}              //传送控制命令ctlSocket
m_CtlSocket=ConnectSocket(m_IP,m_Port);
if(!m_CtlSocket)                
{
    MessageBox("不能连接服务器!\n请稍候再登录!");
return ;
}
UpdateData(true); if(m_user.GetLength()<=0)
{
MessageBox("请输入用户名!");
return ;
}
rval=send(m_CtlSocket,m_user,m_user.GetLength(),0);
if(rval<=0)
{
if(m_CtlSocket)
    closesocket(m_CtlSocket);
return ;
}
          //接收服务端用cast加密的随机数
             int rval= recv(m_CtlSocket, buf, sizeof(buf),0); if (rval <=0)
{ if(m_CtlSocket)
  closesocket(m_CtlSocket);
return ;
}
buf[rval]=NULL;
        //判断是否已经登录
if(strcmp(buf,"EXITS")==0)   //相等
{           if(m_CtlSocket)
    closesocket(m_CtlSocket);
MessageBox("该用户已经登录,请另选ID!\r\n");
return ;
} //调用cast解密函数解密随机数 
              CString str;
str.Format("%s",buf);
CCAST cast;
cast.jiemi(str,m_strDecryptString);

解决方案 »

  1.   

    应该不是这个问题,用户每次登陆认证成功后我都用 closesocket(m_CtlSocket)来结束了登录进程
      

  2.   

    那应该怎么清空缓冲区呢,我刚学不是很懂我发送加密后随机数的语句为
    send(mysock,m_strEncryptString,m_strEncryptString.GetBuffer(2),strlen(m_strEncryptString));
      

  3.   

    是不是你string串接在一起了,可以trace下代码输出
      

  4.   

    可以试试rev()之前清空下memset(buf,0,sizeof(buf)); 
    rev()之后再自己手动加个结束符'\0'
    我也遇到数据叠加又乱码的问题了....
      

  5.   

    谢谢各位!
    搞定了,是调用解密函数前没有将m_strDecryptString清空所致的。