刚开始学习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);
第三个用户则是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);
send(mysock,m_strEncryptString,m_strEncryptString.GetBuffer(2),strlen(m_strEncryptString));
rev()之后再自己手动加个结束符'\0'
我也遇到数据叠加又乱码的问题了....
搞定了,是调用解密函数前没有将m_strDecryptString清空所致的。