Skip to content

Instantly share code, notes, and snippets.

@SangSama
Last active April 16, 2020 13:13
Show Gist options
  • Save SangSama/6152543f9ea9542783b6b8a9163ff76a to your computer and use it in GitHub Desktop.
Save SangSama/6152543f9ea9542783b6b8a9163ff76a to your computer and use it in GitHub Desktop.
#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--;
}
#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