Last active
April 16, 2020 13:13
-
-
Save SangSama/6152543f9ea9542783b6b8a9163ff76a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <WinSock2.h> | |
#pragma comment(lib, "ws2_32") | |
char* ids[64]; | |
int numClients = 0; | |
SOCKET clients[64]; | |
CRITICAL_SECTION cs; | |
int main() | |
{ | |
WSADATA wsa; | |
WSAStartup(MAKEWORD(2, 2), &wsa); | |
InitializeCriticalSection(&cs); | |
SOCKADDR_IN addr; | |
addr.sin_family = AF_INET; | |
addr.sin_addr.s_addr = htonl(INADDR_ANY); | |
addr.sin_port = htons(9000); | |
SOCKET listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); | |
bind(listener, (SOCKADDR*)&addr, sizeof(addr)); | |
listen(listener, 5); | |
fd_set fdread; | |
int ret; | |
char buf[256]; | |
while (1) { | |
FD_ZERO(&fdread); // xoa tap fdread | |
FD_SET(listener, &fdread); // gan socket listener vao fdread | |
// luu socket ket noi den server | |
for (int i = 0; i < numClients; i++) | |
{ | |
FD_SET(clients[i], &fdread); | |
} | |
ret = select(0, &fdread, 0, 0, 0); // cho su kien - ret: so luong cac su kien | |
if (ret < 0) break; | |
// dung IS_SET de kiem tra xem co sk nao dang xay ra hay khong | |
// chap nhan ket noi | |
if (FD_ISSET(listener, &fdread)) { | |
// chac chan cua sk listener vi moi co 1 Socket | |
SOCKET client = accept(listener, NULL, NULL); | |
const char* msg = "Hello client. I'm server \n"; | |
send(client, msg, strlen(msg), 0); | |
clients[numClients] = client; | |
numClients++; | |
} | |
const char* errorMsg = "Sai cu phap. Hay nhap lai.\n"; | |
// tuong tu con cac client o phia sau. do co select ne 2 tien trinh nay gan nhu ngay lap tuc | |
//cho su kien | |
for (int i = 0; i < numClients; i++) | |
{ | |
if (FD_ISSET(clients[i], &fdread)) { | |
char cmd[16], id[32], tmp[32]; | |
int check = 0; | |
if (check == 0) { | |
ret = recv(clients[i], buf, sizeof(buf), 0); | |
if (ret <= 0) | |
{ | |
closesocket(clients[i]); | |
return 0; | |
} | |
buf[ret] = 0; | |
printf("Received: %s\n", buf); | |
// Kiem tra cu phap | |
ret = sscanf(buf, "%s %s %s", cmd, id, tmp); | |
if (ret == 2) | |
{ | |
if (strcmp(cmd, "client_id:") == 0) | |
{ | |
const char* okMsg = "Dang nhap thanh cong. Hay nhap thong diep de chuyen tiep.\n"; | |
send(clients[i], okMsg, strlen(okMsg), 0); | |
EnterCriticalSection(&cs); | |
ids[numClients] = id; | |
check = 1; | |
LeaveCriticalSection(&cs); | |
} | |
else { | |
RemoveClient(clients[i]); | |
send(clients[i], errorMsg, strlen(errorMsg), 0); | |
} | |
} | |
else { | |
RemoveClient(clients[i]); | |
send(clients[i], errorMsg, strlen(errorMsg), 0); | |
} | |
} | |
if(check == 1) { | |
ret = recv(clients[i], buf, sizeof(buf), 0); | |
if (ret <= 0) { | |
// xoa socket nay khoi mang vi no da close roi | |
RemoveClient(clients[i]); | |
continue; | |
} | |
buf[ret] = 0; | |
char sendBuf[256]; | |
printf("Recevied: %s", buf); | |
ret = sscanf(buf, "%s", cmd); // ghi chu dau ra cmd | |
if (ret == -1 || cmd[0] != '@') { | |
send(clients[i], errorMsg, strlen(errorMsg), 0); | |
} | |
else { | |
sprintf(sendBuf, "%s: %s", id, buf + strlen(cmd) + 1); | |
if (strcmp(cmd, "@all") == 0) { | |
for (int j = 0; j < numClients; j++) | |
{ | |
if (clients[i] = clients[j]) { | |
send(clients[j], sendBuf, sizeof(sendBuf), 0); | |
} | |
} | |
} | |
else { | |
for (int j = 0; j < numClients; j++) | |
{ | |
if (strcmp(ids[j], cmd + 1) == 0) { | |
send(clients[j], sendBuf, sizeof(sendBuf), 0); | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
DeleteCriticalSection(&cs); | |
} | |
void RemoveClient(SOCKET client) | |
{ | |
int i = 0; | |
for (; i < numClients; i++) | |
if (clients[i] == client) break; | |
if (i < numClients - 1) | |
clients[i] = clients[numClients - 1]; | |
numClients--; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <WinSock2.h> | |
#pragma comment(lib, "ws2_32") | |
char* ids[64]; | |
int numClients = 0; | |
SOCKET clients[64]; | |
CRITICAL_SECTION cs; | |
int main() | |
{ | |
WSADATA wsa; | |
WSAStartup(MAKEWORD(2, 2), &wsa); | |
InitializeCriticalSection(&cs); | |
SOCKADDR_IN addr; | |
addr.sin_family = AF_INET; | |
addr.sin_addr.s_addr = htonl(INADDR_ANY); | |
addr.sin_port = htons(9000); | |
SOCKET listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); | |
bind(listener, (SOCKADDR*)&addr, sizeof(addr)); | |
listen(listener, 5); | |
fd_set fdread; | |
int ret; | |
char buf[256]; | |
while (1) { | |
FD_ZERO(&fdread); // xoa tap fdread | |
FD_SET(listener, &fdread); // gan socket listener vao fdread | |
// luu socket ket noi den server | |
for (int i = 0; i < numClients; i++) | |
{ | |
FD_SET(clients[i], &fdread); | |
} | |
ret = select(0, &fdread, 0, 0, 0); // cho su kien - ret: so luong cac su kien | |
if (ret < 0) break; | |
// dung IS_SET de kiem tra xem co sk nao dang xay ra hay khong | |
// chap nhan ket noi | |
if (FD_ISSET(listener, &fdread)) { | |
// chac chan cua sk listener vi moi co 1 Socket | |
SOCKET client = accept(listener, NULL, NULL); | |
const char* msg = "Hello client. I'm server \n"; | |
send(client, msg, strlen(msg), 0); | |
clients[numClients] = client; | |
numClients++; | |
} | |
const char* errorMsg = "Sai cu phap. Hay nhap lai.\n"; | |
char user[32], pass[32], tmp[32]; | |
char fbuf[64], fuser[32], fpass[32]; | |
// tuong tu con cac client o phia sau. do co select ne 2 tien trinh nay gan nhu ngay lap tuc | |
//cho su kien | |
for (int i = 0; i < numClients; i++) | |
{ | |
if (FD_ISSET(clients[i], &fdread)) { | |
char cmd[16], id[32], tmp[32]; | |
int check = 0; | |
if (check == 0) { | |
ret = recv(clients[i], buf, sizeof(buf), 0); | |
if (ret <= 0) | |
{ | |
closesocket(clients[i]); | |
return 0; | |
} | |
buf[ret] = 0; | |
// Kiem tra cu phap | |
ret = sscanf(buf, "%s %s %s", user, pass, tmp); | |
if (ret == 2) | |
{ | |
// Doc du lieu tu file va so sanh | |
int found = 0; | |
FILE* f = fopen("c:\\test\\users.txt", "r"); | |
while (!feof(f)) | |
{ | |
fgets(fbuf, sizeof(fbuf), f); | |
ret = sscanf(fbuf, "%s %s", fuser, fpass); | |
if (ret == 2) | |
{ | |
if (strcmp(user, fuser) == 0 && strcmp(pass, fpass) == 0) | |
{ | |
found = 1; | |
break; | |
} | |
} | |
} | |
fclose(f); | |
if (found == 1) | |
{ | |
const char* okMsg = "Dang nhap thanh cong. Hay gui lenh de thuc hien.\n"; | |
send(clients[i], okMsg, strlen(okMsg), 0); | |
break; | |
} | |
else | |
{ | |
const char* errorMsg = "Sai thong tin dang nhap. Hay nhap lai.\n"; | |
RemoveClient(clients[i]); | |
send(clients[i], errorMsg, strlen(errorMsg), 0); | |
} | |
} | |
else { | |
RemoveClient(clients[i]); | |
send(clients[i], errorMsg, strlen(errorMsg), 0); | |
} | |
} | |
if (check == 1) { | |
ret = recv(clients[i], buf, sizeof(buf), 0); | |
if (ret <= 0) { | |
// xoa socket nay khoi mang vi no da close roi | |
RemoveClient(clients[i]); | |
continue; | |
} | |
buf[ret] = 0; | |
char sendBuf[256]; | |
if (buf[ret - 1] == '\n') | |
buf[ret - 1] = 0; | |
strcat(buf, " > c:\\test\\output.txt"); | |
ret = system(buf); | |
FILE* f = fopen("c:\\test\\output.txt", "rb"); | |
while (!feof(f)) | |
{ | |
ret = fread(fbuf, 1, sizeof(fbuf), f); | |
if (ret <= 0) | |
break; | |
send(clients[i], fbuf, ret, 0); | |
} | |
fclose(f); | |
} | |
} | |
} | |
} | |
DeleteCriticalSection(&cs); | |
} | |
void RemoveClient(SOCKET client) | |
{ | |
int i = 0; | |
for (; i < numClients; i++) | |
if (clients[i] == client) break; | |
if (i < numClients - 1) | |
clients[i] = clients[numClients - 1]; | |
numClients--; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment