服务器端注册程序:
#include#include #include #pragma comment (lib,"ws2_32.lib") int main() { //初始化 WSADATA vs; WSAStartup(MAKEWORd(2,2),&vs); if (HIBYTE(vs.wHighVersion) != 2 || LOBYTE(vs.wVersion) != 2) { printf("初始化失败!n"); Sleep(2000); return -1; } //创建本端socket SOCKET udp0 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (udp0 == -1) { printf("socket创建失败!n"); Sleep(2000); WSACleanup(); return -1; } SOCKADDR_IN net0 = { 0 }; net0.sin_family = AF_INET; net0.sin_addr.S_un.S_addr = INADDR_ANY; net0.sin_port = htons(4001); if (bind(udp0, (SOCKADDR*)&net0, sizeof(net0)) == -1) { printf("端口启用失败!n"); Sleep(2000); closesocket(udp0); WSACleanup(); return -1; } //创建对端网络缓存 SOCKADDR_IN net1 = { 0 }; int size_net1 = sizeof(net1); printf("等待用户注册:n"); regist://注册过程 while (1) { char data[50] = {0}; int ret = recvfrom(udp0, data, 50, 0, (SOCKADDR*)&net1, &size_net1); if (ret > 0) { char user[20] = { 0 }; for (int i = 0; i < 20; i++) { user[i] = data[i]; if (user[i] == 0) break; } //以用户名打开文件,检验文件是否已经存在 FILE* pf = fopen(user, "r"); if (pf!= NULL) { sendto(udp0,"该账号已存在,请直接登录!",30,0,(SOCKADDR*)&net1,sizeof(net1)); fclose(pf); pf = NULL; goto regist; } //以用户名创建文件,存储用户信息 FILE* pf1 = fopen(user, "a+"); fprintf(pf1, "%sn", user); int j = 0; char password[20] = { 0 }; for (int i = 20; i < 40; i++) { password[j] = data[i]; if (password[j] == 0) break; j++; } fprintf(pf1, "%sn", password); fclose(pf1); pf1 = NULL; sendto(udp0, "注册成功!", 10, 0, (SOCKADDR*)&net1, sizeof(net1)); time_t rawtime; struct tm * timeinfo; time(&rawtime); timeinfo = localtime(&rawtime); printf("%s %s注册成功!n", asctime(timeinfo),user); //将注册信息写入日志文件 FILE* info = fopen("regist.info","a+"); fprintf(info,"%s %s注册成功!nn", asctime(timeinfo), user); fclose(info); info = NULL; } } return 0; }
服务器端登录程序:
#include#include #pragma comment (lib,"ws2_32.lib") int main() { //初始化网络 WSADATA vs; WSAStartup(MAKEWORd(2,2),&vs); //创建本地socket和信息并绑定 SOCKET udp0 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); SOCKADDR_IN net0 = { 0 }; net0.sin_family = AF_INET; net0.sin_addr.S_un.S_addr = INADDR_ANY; net0.sin_port = htons(4002); if(bind(udp0, (SOCKADDR*)&net0, sizeof(net0)) == SOCKET_ERROR) { printf("端口启用失败!n"); closesocket(udp0); WSACleanup(); return -1; } //创建客户端网络信息缓存 SOCKADDR_IN net1 = { 0 }; int size_net1 = sizeof(net1); printf("等待用户登录:n"); regist://登录过程 while (1) { //接收注册包 char data[50] = { 0 }; int ret = recvfrom(udp0,data,50,0,(SOCKADDR*)&net1,&size_net1); if (ret > 0) { FILE* pf = fopen(data,"r"); if (pf == NULL) { sendto(udp0,"请先注册!",11,0,(SOCKADDR*)&net1,sizeof(net1)); goto regist; } //创建服务器账户密码缓存 char user[20] = { 0 }, password[20] = { 0 }; //将账户密码存到数组 for (int i = 0; i < 20; i++) { user[i] = fgetc(pf); if (user[i] == 'n') { user[i] = ' '; break; } } for (int i = 0; i < 20; i++) { password[i] = fgetc(pf); if (password[i] == 'n') { password[i] = ' '; break; } } fclose(pf); pf = NULL; //创建接收到的用户与密码 char in_user[20] = { 0 }; char in_password[20] = { 0 }; //从接收到的数据帧中导入账户密码 for (int i = 0; i < 20; i++) { in_user[i] = data[i]; if (user[i] == ' ') break; } int j = 20; for (int i = 0; i < 20; i++) { in_password[i] = data[j]; j++; if (password[i] == ' ') break; } //比对接收到的账户密码与服务器本地的账户密码关系 if (strcmp(user, in_user) == 0 && strcmp(password, in_password) == 0) { sendto(udp0,"登录成功!",11,0,(SOCKADDR*)&net1,sizeof(net1)); FILE* pf1 = fopen("login.info","a+"); time_t rawtime; struct tm * timeinfo; time(&rawtime); timeinfo = localtime(&rawtime); printf("%s %s登录成功!nn", asctime(timeinfo),user); //登录信息写入日志 fprintf(pf1,"%s %s登录成功!nn", asctime(timeinfo), user); fclose(pf1); pf1 = NULL; } else { printf("%s密码错误!n",user); sendto(udp0, "密码错误!", 11, 0, (SOCKADDR*)&net1, sizeof(net1)); } } } return 0; }
注意服务器注册和登录程序需要在同一文件夹!
客户端:
#include#include #include #pragma comment(lib,"ws2_32.lib") #define password_error -10 #define user_error -9 #define login_success 10 #define regist_success 5 #define server_error -3 int regist() { //初始化网络 WSADATA vs; WSAStartup(MAKEWORd(2,2),&vs); if (HIBYTE(vs.wVersion) != 2 || LOBYTE(vs.wVersion) != 2) { printf("网络初始化失败!n"); Sleep(2000); return -1; } //创建本地接口 SOCKET udp0 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (udp0 == SOCKET_ERROR) { printf("socket 创建失败!n"); Sleep(2000); WSACleanup(); return -1; } //创建服务器网络信息 SOCKADDR_IN net1 = { 0 }; net1.sin_family = AF_INET; net1.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); net1.sin_port = htons(4001); int size_net1 = sizeof(net1); //创建账号密码缓存并输入 char user[50] = {0}, password[50] = { 0 }; printf("请输入您想要注册的用户名:"); scanf("%s",user); printf("请输入密码:"); scanf("%s",password); if (strlen(user) > 18||strlen(password)>18) { printf("超过18位,程序退出!"); Sleep(2000); return -1; } //创建注册包,并将账号密码放入其中 char regist[50] = { 0 }; for (int i = 0; i < 20; i++) { regist[i] = user[i]; if (regist[i] == 0) break; } int j = 0; for (int i = 20; i < 40; i++) { regist[i] = password[j]; if (regist[i] == 0) break; j++; } //发送注册包并等待返回值 sendto(udp0,regist,50,0,(SOCKADDR*)&net1,size_net1); char data[50] = { 0 }; int ret = recvfrom(udp0, data, 50, 0, (SOCKADDR*)&net1, &size_net1); if (ret > 0) { if (strcmp(data, "该账号已存在,请直接登录!") == 0) { closesocket(udp0); WSACleanup(); return user_error; } if (strcmp(data, "注册成功!") == 0) { closesocket(udp0); WSACleanup(); return regist_success; } } if (ret < 0) { return server_error; } return 0; } int login(char user[20],char password[20]) { //初始化网络 WSADATA vs; WSAStartup(MAKEWORd(2, 2), &vs); if (HIBYTE(vs.wVersion) != 2 || LOBYTE(vs.wVersion) != 2) { printf("网络初始化失败!n"); Sleep(2000); return -1; } //创建本地网络接口 SOCKET udp0 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (udp0 == SOCKET_ERROR) { printf("socket创建失败!n"); WSACleanup(); Sleep(2000); return -1; } //创建登录服务器网络参数 SOCKADDR_IN net1 = { 0 }; net1.sin_family = AF_INET; net1.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); net1.sin_port = htons(4002); int size_net1 = sizeof(net1); //创建登录包,将账号密码放入其中 char data[50] = { 0 }; for (int i = 0; i < 20; i++) { data[i] = user[i]; if (data[i] == ' ') break; } int j = 0; for (int i = 20; i < 40; i++) { data[i] = password[j]; j++; if (data[i] == ' ') break; } //发送登录包,等待回复 sendto(udp0, data, 50, 0, (SOCKADDR*)&net1, sizeof(net1)); char recv_data[50] = { 0 }; int ret = recvfrom(udp0, recv_data, 50, 0, (SOCKADDR*)&net1, &size_net1); if (ret > 0) { if (strcmp(recv_data, "登录成功!") == 0) return login_success; if (strcmp(recv_data, "密码错误!") == 0) return password_error; if (strcmp(recv_data, "请先注册!") == 0) return user_error; } return 0; } int chat(char user[20]) { printf("%s可以聊天了!n",user); Sleep(2000); return 0; } int main() { int a = 0, b= 0; printf("1.登录 2.注册"); scanf("%d",&a); if (a == 1) { to_login:; char user[20] = { 0 }; char password[20] = { 0 }; printf("请输入用户名:"); scanf("%s",user); printf("请输入密码:"); scanf("%s",password); b = login(user,password); if (b == user_error) { printf("请先注册账号n"); goto to_regist; } if (b == password_error) { printf("密码错误,重新输入n"); goto to_login; } if (b == login_success) { printf("登录成功!n"); chat(user); return 0; } } else if (a==2) { to_regist: b = regist(); if (b == user_error) { printf("账号已经注册过了!请直接登录n"); goto to_login; } if (b == regist_success) { printf("注册成功!可以登录了n"); goto to_login; } } else { printf("输入错误!n"); return -1; } return 0; }
聊天函数暂时还没写;有时间再弄!



