上一节是登录按钮,这一节是注册与发送按钮:
注册与登录按钮相差不多,连接服务器的操作都是一样的,就是注册是把用户信息传递给服务器,由服务器检查是否是已存在用户名,或者是否超出注册上限,根据服务器返回的消息来判断当前操作。 可以看一下之前写的服务器的文章,里面有对注册信息的处理;
void Cconnent1Dlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
//加载套接字
WSADATA wsaData;
char buff[10000];
memset(buff, 0, sizeof(buff));//
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("Failed to load Winsock");
//return 0;
}
SOCKADDR_IN addrSrv; //服务端地址
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(5099);
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//创建客户端套接字
sockClient = socket(AF_INET, SOCK_STREAM, 0);//流步套接字
if (SOCKET_ERROR == sockClient) {
printf("Socket() error:%d", WSAGetLastError());
//return 0;
}
//向服务器发出连接请求
if (connect(sockClient, (struct sockaddr*)&addrSrv, sizeof(addrSrv)) == INVALID_SOCKET) {
printf("Connect failed:%d", WSAGetLastError());
//return 0;
}
else
{
//获取
int i;
for (i = 0; i < m_user.GetLength(); i++)
user[i] = (char)(m_user.GetAt(i));
user[i] = '\0';//清空i+1之后的数组内容
i = 0;
for (i = 0; i < m_pw.GetLength(); i++)
pw[i] = (char)(m_pw.GetAt(i));
pw[i] = '\0';
recv(sockClient, buff, sizeof(buff), 0);
//发送给服务器注册信息
send(sockClient, "2", sizeof(user), 0);//发送请求服务类型,为1表示登录,为2表示注册
Sleep(1);
send(sockClient, user, sizeof(user), 0);//发送用户名
Sleep(1);
send(sockClient, pw, sizeof(pw), 0);//发送密码
Sleep(1);
//清空buff以接收服务器传来的消息
memset(buff, 0, sizeof(buff));
recv(sockClient, buff, sizeof(buff), 0);
if (strcmp(buff, "用户名已存在") == 0)
{
AfxMessageBox(_T("用户名已存在!"));
}
else
if (strcmp(buff, "注册已满") == 0)
{
AfxMessageBox(_T("注册用户已满!"));
}
else
if (strcmp(buff, "注册成功") == 0)
{
AfxMessageBox(_T("注册成功!"));
success = true;
}
}
}
发送按钮则是发送消息给服务器,由服务器接收转发:
void Cconnent1Dlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
//num = (char)(.GetAt(0));
int i;
for (i = 0; i < m_message.GetLength(); i++)
{
buff[i ] = (char)(m_message.GetAt(i));
}
buff[i] = '\0';
//buff[0] = num;
if (send(sockClient, buff, sizeof(buff), 0)<0)
AfxMessageBox(_T("发送失败!"));
else
AfxMessageBox(_T("发送成功!"));
//UpdateData(true);
//if(send())
}