#include二、客户端#include #include #include #pragma comment (lib, "ws2_32.lib") #define Max_client 8 ///The number of max clients connected. #define Max_idlength 10 ///The biggest length of user id void communication(LPVOID n); void add_s_n_s(char *s1,int id,char *s2); void Login(LPVOID n); SOCKET clientSocket[Max_client]; int login_voucher[Max_client]; char User_id[Max_client][Max_idlength]; int k = 1; char *account_file = "D:/code/C/socket/basin/file_transmission/account.txt"; int main() { WSADATA wsaData; WSAStartup(MAKEWORd(2, 2), &wsaData) != 0; if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { printf("The version of WSADATA is wrong!n"); return -1; } printf("The version of WSADATA is available!n"); SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (serverSocket == INVALID_SOCKET) { printf("Create the Socket unsuccessfully!n"); return -1; } printf("Create the Socket successfully!n"); SOCKADDR_IN addr = { 0 }; addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); addr.sin_family = AF_INET; addr.sin_port = htons(10086); int r = bind(serverSocket, (SOCKADDR*)&addr, sizeof(addr)); if (r == -1) { printf("Fail to bind!n" ); return -1; } printf("Binded!n" ); r = listen(serverSocket, 10); if (r == -1) { printf("Fail to listen!n" ); return -1; } printf("Listened!n" ); SOCKADDR_IN cAddr = { 0 }; int len = sizeof(cAddr); int i = 0; while (i < Max_client) { clientSocket[i++] = accept(serverSocket, (SOCKADDR*)&cAddr, &len); k++; if (clientSocket[i - 1] == SOCKET_ERROR) { printf("The client is not available!n"); closesocket(serverSocket); WSACleanup(); return -1; } printf("The client %s has connected with server!n",inet_ntoa(cAddr.sin_addr)); CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)communication, (LPVOID)i, NULL, NULL); } return 0; } void communication(LPVOID n) { Login(n); char buff[256]; int r; int i = (int)n; if(login_voucher[i-1]==1) { return ; } memset(buff,0,256); strcpy(buff,User_id[i-1]); send(clientSocket[i-1],buff,strlen(buff),NULL); while (1) { memset(buff, 0, 256); r = recv(clientSocket[i - 1], buff, 255, NULL); if (r > 0) { printf("%sn",buff); for (int j = 0; j < k; j++) { if(j!=i-1) send(clientSocket[j], buff, strlen(buff), NULL); } } } } void Login(LPVOID n) { char buff[256]; FILE *fp; int read_fp=0; int i= (int)n; char user_id[10],user_pwd[10],user_name[10]; fp = fopen(account_file,"rb"); if(fp==NULL) { printf("The file %s does not exit!",account_file); fclose(fp); return; } recv(clientSocket[i-1],buff,255,0); printf("The client want to login the account whose ID is %sn",buff); while(1) { read_fp=fscanf(fp,"%s %s %s",user_id,user_pwd,user_name); if(read_fp==-1) { memset(buff,0,256); sprintf(buff,"N"); send(clientSocket[i-1],buff,strlen(buff),0); memset(buff,0,256); sprintf(buff,"Can't find the account!"); send(clientSocket[i-1],buff,strlen(buff),0); fclose(fp); return 0; } if(strcmp(user_id,buff)==0) { memset(buff,0,256); sprintf(buff,"Y"); send(clientSocket[i-1],buff,strlen(buff),0); memset(buff,0,256); sprintf(buff,"Please input the password of the account!"); send(clientSocket[i-1],buff,strlen(buff),0); fclose(fp); break; } } int pwd_time =1; while(pwd_time<4) { memset(buff,0,256); recv(clientSocket[i-1],buff,255,0); printf("%sn",buff); if (strcmp(buff,user_pwd)==0) { memset(buff,0,256); sprintf(buff,"Y"); send(clientSocket[i-1],buff,strlen(buff),0); memset(buff,0,256); sprintf(buff,"Login the account successfully!"); send(clientSocket[i-1],buff,strlen(buff),0); printf("One account has login,ID:%s PWD:%s NAME:%sn",user_id,user_pwd,user_name); memset(buff,0,256); strcpy(buff,user_name); send(clientSocket[i-1],buff,strlen(buff),0); break; } memset(buff,0,256); sprintf(buff,"N"); send(clientSocket[i-1],buff,strlen(buff),0); pwd_time += 1; memset(buff,0,256); sprintf(buff,"Please input the password again!"); send(clientSocket[i-1],buff,strlen(buff),0); } if(pwd_time<4) { return 1; } sprintf(buff,"Login the account unsuccessfully!"); send(clientSocket[i-1],buff,strlen(buff),0); return 0; }
#include三、使用方法 1、需要替换掉服务端的account_file文件路径,txt内容格式为一行包括:账号名 密码 用户名,例如1 1234 hans。 四、参考博客#include #include #include #pragma comment (lib, "ws2_32.lib") SOCKET serverSocket; void scan(char s[],int len); int Login(); char user_name[10]; void recvAndShow() { int r, i = 0; char buff[256]; while (1) { memset(buff, 0, 256); r = recv(serverSocket, buff, 255, NULL); if(r>0) printf("%sn",buff); } } int main() { WSADATA wsaData; char buff[256]; char buff1[256]; WSAStartup(MAKEWORd(2, 2), &wsaData) != 0; if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { printf("The version of WSADATA is wrong!n"); return -1; } printf("The version of WSADATA is available!n"); serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (serverSocket == INVALID_SOCKET) { printf("Create the Socket unsuccessfully!n"); return -1; } printf("Create the Socket successfully!n"); SOCKADDR_IN addr = { 0 }; addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); addr.sin_family = AF_INET; addr.sin_port = htons(10086); int r = connect(serverSocket, (SOCKADDR*)&addr, sizeof(addr)); if (r == -1) { printf("It is successful to connect with the Server!n"); return -1; } printf("It is unsuccessful to connect with the Server!n"); while(!Login()) continue; CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)recvAndShow, NULL, NULL, NULL); fflush(stdin); while (1) { memset(buff, 0, 256); memset(buff1,0,256); printf("User %s:",user_name); scan(buff,256); sprintf(buff1,"User %s:%s",user_name,buff); r = send(serverSocket, buff1, strlen(buff1), NULL); } return 0; } int Login() { char buff[256]; int i=1; printf("Login ID:"); memset(buff,0,256); scanf("%s",buff); send(serverSocket,buff,strlen(buff),0); memset(buff,0,256); recv(serverSocket,buff,255,0); if(buff[0]=='N') { memset(buff,0,256); recv(serverSocket,buff,255,0); printf("%s",buff); return 0; } memset(buff,0,256); recv(serverSocket,buff,255,0); printf("%sn",buff); while(i<4) { printf("Login PWD:"); memset(buff,0,256); scanf("%s",buff); send(serverSocket,buff,strlen(buff),0); recv(serverSocket,buff,255,0); if(buff[0]=='Y') { memset(buff,0,256); recv(serverSocket,buff,255,0); printf("%sn",buff); memset(buff,0,256); recv(serverSocket,buff,255,0); strcpy(user_name,buff); return 1; } memset(buff,0,256); recv(serverSocket,buff,255,0); printf("%sn",buff); } memset(buff,0,256); recv(serverSocket,buff,255,0); printf("%sn",buff); return 0; } void scan(char *s,int len) { char c; int i=0; while(i c = getchar(); if(c =='n') return ; s[i++] = c; } printf("The input is bigger than the length of char arrayn"); return ; }
C++基于socket编程实现聊天室功能



