/61
lOMoARcPSD| 61549570
//nonblock_server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <errno.h>
int main() {
// Tao socket cho ket noi
int listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listener == -1) { perror("socket() failed"); return 1; }
// Chuyen socket sang che do bat dong bo
unsigned long ul = 1; ioctl(listener,
FIONBIO, &ul);
// Khai bao dia chi server struct sockaddr_in
addr; addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(8000);
// Gan socket voi cau truc dia chi
lOMoARcPSD| 61549570
if (bind(listener, (struct sockaddr *)&addr, sizeof(addr))) {
perror("bind() failed"); return 1; }
// Chuyen socket sang trang thai cho ket noi
if (listen(listener, 5)) { perror("listen()
failed"); return 1; }
int clients[64];
int numClients = 0;
char buf[256];
while (1)
{
// printf("Dang cho ket noi...\n"); int
client = accept(listener, NULL, NULL); if
(client != -1)
{
printf("Co ket noi moi: %d\n", client);
// Chuyen socket sang che do bat dong bo
ul = 1;
ioctl(client, FIONBIO, &ul);
clients[numClients] = client; numClients++;
}
else {
if (errno == EWOULDBLOCK) {
// Loi do chua co ket noi
lOMoARcPSD| 61549570
// Khong xu ly gi them
} else {
break; }
}
// printf("Dang nhan du lieu tu cac client:\n");
for (int i = 0; i < numClients; i++)
{
int ret = recv(clients[i], buf, sizeof(buf), 0);
if (ret != -1) { if (ret == 0)
continue;
buf[ret] = 0;
printf("Received from %d: %s\n", clients[i], buf);
} else {
if (errno == EWOULDBLOCK) {
// Loi do chua co du lieu
// Khong xu ly gi them
} else {
continue;
}
} }
}
close(listener);
return 1;
}
lOMoARcPSD| 61549570
//poll_server
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <poll.h>
#define MAX_FDS 2048
int main() {
// Tao socket cho ket noi
int listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listener == -1) { perror("socket() failed"); return 1; }
// Khai bao dia chi server struct sockaddr_in
addr; addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(8000);
// Gan socket voi cau truc dia chi
if (bind(listener, (struct sockaddr *)&addr, sizeof(addr))) {
perror("bind() failed"); return 1; }
// Chuyen socket sang trang thai cho ket noi
if (listen(listener, 5)) { perror("listen()
failed"); return 1;
lOMoARcPSD| 61549570
}
struct pollfd fds[MAX_FDS];
int nfds = 0;
// Gan socket listener vao tap tham do
fds[0].fd = listener; fds[0].events =
POLLIN; nfds++;
char buf[256];
while (1) {
int ret = poll(fds, nfds, -1);
if (ret == -1) { break;
} if (ret == 0) {
printf("Timed out!!!\n");
continue;
}
for (int i = 0; i < nfds; i++) {
if (fds[i].revents & POLLIN) {
if (fds[i].fd == listener) {
// Co ket noi moi
int client = accept(listener, NULL, NULL);
if (client >= MAX_FDS) { // Vuot qua
so luong toi da close(client);
} else {
// Them vao mang tham do su kien
fds[nfds].fd = client;
fds[nfds].events = POLLIN; nfds++;
lOMoARcPSD| 61549570
printf("New client connected: %d\n", client);
}
} else {
// Co du lieu tu client truyen den
int client = fds[i].fd; ret =
recv(client, buf, sizeof(buf), 0); if
(ret <= 0) {
// Ket noi bi dong => Xoa khoi mang
} else {
// Xu ly du lieu nhan duoc
buf[ret] = 0;
printf("Received from %d: %s\n", client, buf);
// Chuyen tiep du lieu cho cac client khac
for (int j = 0; j < nfds; j++)
if (fds[j].fd != listener && fds[j].fd != client)
send(fds[j].fd, buf, strlen(buf), 0);
}
}
}
} }
return 0; }
//select_server
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
lOMoARcPSD| 61549570
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/select.h>
int main() {
// Tao socket cho ket noi
int listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listener == -1) { perror("socket() failed"); return 1; }
// Khai bao dia chi server struct sockaddr_in
addr; addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(9000);
// Gan socket voi cau truc dia chi
if (bind(listener, (struct sockaddr *)&addr, sizeof(addr))) {
perror("bind() failed"); return 1; }
// Chuyen socket sang trang thai cho ket noi
if (listen(listener, 5)) { perror("listen()
failed"); return 1; }
fd_set fdread, fdtest;
FD_ZERO(&fdread);
// Gan socket listener vao fdread
FD_SET(listener, &fdread);
lOMoARcPSD| 61549570
char buf[256];
while (1) {
fdtest = fdread;
int ret = select(FD_SETSIZE, &fdtest, NULL, NULL, NULL);
if (ret == -1) { break;
}
for (int i = 0; i < FD_SETSIZE; i++)
if (FD_ISSET(i, &fdtest)) {
if (i == listener) {
// Co ket noi
int client = accept(listener, NULL, NULL);
if (client >= FD_SETSIZE) {
close(client); } else {
FD_SET(client, &fdread);
printf("New client connected: %d\n", client);
}
} else {
// Co du lieu truyen den
int client = i;
ret = recv(client, buf, sizeof(buf), 0);
if (ret <= 0) { close(client);
FD_CLR(client, &fdread);
} else {
buf[ret] = 0;
printf("Received from %d: %s\n", client, buf);
lOMoARcPSD| 61549570
}
}
}
} return
0; }
//chat_server
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/select.h>
int remove_client(int client, int *client_sockets, char **client_names, int *num_clients) {
int i = 0;
for (; i < *num_clients; i++)
if (client_sockets[i] == client)
break;
if (i < *num_clients) {
if (i < *num_clients - 1) {
client_sockets[i] = client_sockets[*num_clients - 1];
strcpy(client_names[i], client_names[*num_clients - 1]);
}
lOMoARcPSD| 61549570
free(client_names[*num_clients - 1]);
*num_clients -= 1;
}
}
int main() {
// Tao socket cho ket noi
int listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listener == -1) { perror("socket() failed"); return 1; }
// Khai bao dia chi server struct sockaddr_in
addr; addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(9000);
// Gan socket voi cau truc dia chi
if (bind(listener, (struct sockaddr *)&addr, sizeof(addr))) {
perror("bind() failed"); return 1; }
// Chuyen socket sang trang thai cho ket noi
if (listen(listener, 5)) { perror("listen()
failed"); return 1; }
fd_set fdread, fdtest;
FD_ZERO(&fdread);
// Gan socket listener vao fdread
FD_SET(listener, &fdread);
char buf[256];
lOMoARcPSD| 61549570
// Mang luu tru cac client da dang nhap
int client_sockets[FD_SETSIZE]; char
*client_names[FD_SETSIZE]; int
num_clients = 0;
while (1) {
fdtest = fdread;
int ret = select(FD_SETSIZE, &fdtest, NULL, NULL, NULL);
if (ret == -1) { break;
}
for (int i = 0; i < FD_SETSIZE; i++)
if (FD_ISSET(i, &fdtest)) { if
(i == listener) { // Co ket noi
int client = accept(listener, NULL, NULL);
if (client >= FD_SETSIZE) {
close(client); } else {
FD_SET(client, &fdread);
printf("New client connected: %d\n", client);
}
} else {
// Co du lieu truyen den
int client = i;
ret = recv(client, buf, sizeof(buf), 0);
if (ret <= 0) { close(client);
FD_CLR(client, &fdread);
// Xoa client ra khoi mang dang nhap
lOMoARcPSD| 61549570
remove_client(client, client_sockets, client_names, &num_clients);
continue;
}
// In ra man hinh server
buf[ret] = 0;
printf("Received from %d: %s\n", client, buf);
// Kiem tra trang thai dang nhap
int j = 0;
for (; j < num_clients; j++) if
(client_sockets[j] == client) break;
if (j == num_clients) { // Chua dang nhap
char cmd[16], id[32], tmp[32]; int n =
sscanf(buf, "%s %s %s", cmd, id, tmp); if (n
== 2) {
if (strcmp(cmd, "client_id:") == 0) {
// Kiem tra id da ton tai chua int k
= 0;
for (; k < num_clients; k++)
if (strcmp(client_names[k], id) == 0)
break; if (k < num_clients) {
// id da ton tai
char *msg = "ID da ton tai. Hay nhap ID khac\n";
send(client, msg, strlen(msg), 0);
} else {
// id chua ton tai
char *msg = "Dang nhap thanh cong.\n";
send(client, msg, strlen(msg), 0);
lOMoARcPSD| 61549570
// Chuyen client sang trang thai dang nhap
client_sockets[num_clients] = client;
client_names[num_clients] = malloc(strlen(id) + 1);
memcpy(client_names[num_clients], id, strlen(id) + 1);
// strcpy(client_names[num_clients], id);
num_clients++;
}
} else {
char *msg = "Sai cu phap. Hay nhap lai.\n";
send(client, msg, strlen(msg), 0);
}
} else {
char *msg = "Sai cu phap. Hay nhap lai.\n";
send(client, msg, strlen(msg), 0);
}
} else {
// Da dang nhap
char receiver[32];
sscanf(buf, "%s", receiver);
if (strcmp(receiver, "all") == 0) {
// Chuyen tiep tin nhan cho cac client da dang nhap khac
for (int k = 0; k < num_clients; k++) if
(client_sockets[k] != client) { char msg[512];
sprintf(msg, "%s: %s\n", client_names[j], buf + strlen(receiver) + 1);
send(client_sockets[k], msg, strlen(msg), 0);
lOMoARcPSD| 61549570
}
} else {
// Chuyen tiep tin nhan cho mot client
for (int k = 0; k < num_clients; k++)
if (strcmp(client_names[k], receiver) == 0) {
char msg[512];
sprintf(msg, "%s: %s\n", client_names[j], buf + strlen(receiver) + 1);
send(client_sockets[k], msg, strlen(msg), 0);
}
}}
}}
}
return 0;
}
//telnet_sẻver
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/select.h>
int main() {
// Tao socket cho ket noi
int listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listener == -1) { perror("socket() failed"); return 1; }
lOMoARcPSD| 61549570
// Khai bao dia chi server
struct sockaddr_in addr; addr.sin_family =
AF_INET; addr.sin_addr.s_addr =
htonl(INADDR_ANY); addr.sin_port =
htons(8000); // Gan socket voi cau truc dia chi
if (bind(listener, (struct sockaddr *)&addr, sizeof(addr))) {
perror("bind() failed"); return 1; }
// Chuyen socket sang trang thai cho ket noi
if (listen(listener, 5)) { perror("listen()
failed"); return 1; }
fd_set fdread, fdtest;
FD_ZERO(&fdread);
// Gan socket listener vao fdread
FD_SET(listener, &fdread); int
client_sockets[FD_SETSIZE]; int
num_clients = 0;
char buf[256];
while (1) {
fdtest = fdread;
int ret = select(FD_SETSIZE, &fdtest, NULL, NULL, NULL);
if (ret == -1) { break;
}
for (int i = 0; i < FD_SETSIZE; i++)
if (FD_ISSET(i, &fdtest)) { if
(i == listener) { // Co ket noi
lOMoARcPSD| 61549570
int client = accept(listener, NULL, NULL);
if (client >= FD_SETSIZE) {
close(client); } else {
FD_SET(client, &fdread);
printf("New client connected: %d\n", client);
}
} else {
// Co du lieu truyen den
int client = i;
ret = recv(client, buf, sizeof(buf), 0);
if (ret <= 0) { close(client);
FD_CLR(client, &fdread);
continue;
}
buf[ret] = 0;
printf("Received from %d: %s\n", client, buf);
int j = 0;
for (; j < num_clients; j++) if
(client_sockets[j] == client)
break;
if (j == num_clients) {
// Chua dang nhap
char user[32], pass[32], tmp[65], line[65];
int n = sscanf(buf, "%s %s %s", user, pass, tmp);
if (n != 2) {
lOMoARcPSD| 61549570
char *msg = "Sai cu phap. Hay nhap lai.\n";
send(client, msg, strlen(msg), 0);
} else {
// Kiem tra thong tin dang nhap
sprintf(tmp, "%s %s\n", user, pass);
FILE *f = fopen("accounts.txt", "r"); int
found = 0;
while (fgets(line, sizeof(line), f) != NULL) {
if (strcmp(tmp, line) == 0) { found = 1;
break;
}
} if (found)
{
char *msg = "Dang nhap thanh cong.\n";
send(client, msg, strlen(msg), 0);
// Luu thong tin dang nhap
client_sockets[num_clients] = client;
num_clients++;
} else {
char *msg = "Dang nhap that bai. Hay nhap lai.\n";
send(client, msg, strlen(msg), 0);
}
fclose(f); }
} else {
// Da dang nhap
char cmd[300];
lOMoARcPSD| 61549570
// Xoa ky tu xuong dong o cuoi buf
if (buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = 0;
// Thuc hien lenh
sprintf(cmd, "%s > out.txt", buf);
system(cmd);
// Tra lai ket qua cho client
FILE *f = fopen("out.txt", "rb");
while (1) {
int n = fread(buf, 1, sizeof(buf), f);
if (n <= 0) break;
send(client, buf, n, 0);
}
fclose(f);
}
}
}
} return
0;
}
//multiprocess_server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
lOMoARcPSD| 61549570
#include <arpa/inet.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
void signalHanlder(int signo) {
pid_t pid = wait(NULL);
printf("Child process terminated, pid = %d\n", pid);
}
int main() {
// Tao socket cho ket noi
int listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listener == -1) { perror("socket() failed"); return 1; }
// Khai bao dia chi server struct sockaddr_in
addr; addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(8000);
// Gan socket voi cau truc dia chi
if (bind(listener, (struct sockaddr *)&addr, sizeof(addr))) {
perror("bind() failed"); return 1; }
// Chuyen socket sang trang thai cho ket noi
if (listen(listener, 5)) { perror("listen()
failed"); return 1;
}
lOMoARcPSD| 61549570
signal(SIGCHLD, signalHanlder);
while (1) {
printf("Waiting for new client\n"); int client =
accept(listener, NULL, NULL); printf("New client
accepted, client = %d\n", client);
if (fork() == 0) {
// Tien trinh con, xu ly yeu cau tu client
// Dong socket listener
close(listener);
char buf[256];
while (1) {
int ret = recv(client, buf, sizeof(buf), 0);
if (ret <= 0) break;
buf[ret] = 0;
printf("Received: %s", buf);
}
// Ket thuc tien trinh con
exit(0);
}
// Dong socket client o tien trinh cha
close(client);
}
return 0;
}

Preview text:

lOMoAR cPSD| 61549570 //nonblock_server.c #include #include #include #include #include #include #include #include #include int main() { // Tao socket cho ket noi
int listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listener == -1) { perror("socket() failed"); return 1; }
// Chuyen socket sang che do bat dong bo
unsigned long ul = 1; ioctl(listener, FIONBIO, &ul);
// Khai bao dia chi server struct sockaddr_in
addr; addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(8000);
// Gan socket voi cau truc dia chi lOMoAR cPSD| 61549570
if (bind(listener, (struct sockaddr *)&addr, sizeof(addr))) {
perror("bind() failed"); return 1; }
// Chuyen socket sang trang thai cho ket noi
if (listen(listener, 5)) { perror("listen() failed"); return 1; } int clients[64]; int numClients = 0; char buf[256]; while (1) {
// printf("Dang cho ket noi...\n"); int
client = accept(listener, NULL, NULL); if (client != -1) {
printf("Co ket noi moi: %d\n", client);
// Chuyen socket sang che do bat dong bo ul = 1;
ioctl(client, FIONBIO, &ul);
clients[numClients] = client; numClients++; } else { if (errno == EWOULDBLOCK) { // Loi do chua co ket noi lOMoAR cPSD| 61549570 // Khong xu ly gi them } else { break; } }
// printf("Dang nhan du lieu tu cac client:\n");
for (int i = 0; i < numClients; i++) {
int ret = recv(clients[i], buf, sizeof(buf), 0);
if (ret != -1) { if (ret == 0) continue; buf[ret] = 0;
printf("Received from %d: %s\n", clients[i], buf); } else { if (errno == EWOULDBLOCK) { // Loi do chua co du lieu // Khong xu ly gi them } else { continue; } } } } close(listener); return 1; } lOMoAR cPSD| 61549570 //poll_server #include #include #include #include #include #include #include #include #define MAX_FDS 2048 int main() { // Tao socket cho ket noi
int listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listener == -1) { perror("socket() failed"); return 1; }
// Khai bao dia chi server struct sockaddr_in
addr; addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(8000);
// Gan socket voi cau truc dia chi
if (bind(listener, (struct sockaddr *)&addr, sizeof(addr))) {
perror("bind() failed"); return 1; }
// Chuyen socket sang trang thai cho ket noi
if (listen(listener, 5)) { perror("listen() failed"); return 1; lOMoAR cPSD| 61549570 } struct pollfd fds[MAX_FDS]; int nfds = 0;
// Gan socket listener vao tap tham do
fds[0].fd = listener; fds[0].events = POLLIN; nfds++; char buf[256]; while (1) {
int ret = poll(fds, nfds, -1); if (ret == -1) { break; } if (ret == 0) { printf("Timed out!!!\n"); continue; }
for (int i = 0; i < nfds; i++) {
if (fds[i].revents & POLLIN) { if (fds[i].fd == listener) { // Co ket noi moi
int client = accept(listener, NULL, NULL);
if (client >= MAX_FDS) { // Vuot qua
so luong toi da close(client); } else {
// Them vao mang tham do su kien fds[nfds].fd = client;
fds[nfds].events = POLLIN; nfds++; lOMoAR cPSD| 61549570
printf("New client connected: %d\n", client); } } else {
// Co du lieu tu client truyen den int client = fds[i].fd; ret =
recv(client, buf, sizeof(buf), 0); if (ret <= 0) {
// Ket noi bi dong => Xoa khoi mang } else { // Xu ly du lieu nhan duoc buf[ret] = 0;
printf("Received from %d: %s\n", client, buf);
// Chuyen tiep du lieu cho cac client khac
for (int j = 0; j < nfds; j++)
if (fds[j].fd != listener && fds[j].fd != client)
send(fds[j].fd, buf, strlen(buf), 0); } } } } } return 0; } //select_server #include #include #include #include lOMoAR cPSD| 61549570 #include #include #include #include int main() { // Tao socket cho ket noi
int listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listener == -1) { perror("socket() failed"); return 1; }
// Khai bao dia chi server struct sockaddr_in
addr; addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(9000);
// Gan socket voi cau truc dia chi
if (bind(listener, (struct sockaddr *)&addr, sizeof(addr))) {
perror("bind() failed"); return 1; }
// Chuyen socket sang trang thai cho ket noi
if (listen(listener, 5)) { perror("listen() failed"); return 1; } fd_set fdread, fdtest; FD_ZERO(&fdread);
// Gan socket listener vao fdread
FD_SET(listener, &fdread); lOMoAR cPSD| 61549570 char buf[256]; while (1) { fdtest = fdread;
int ret = select(FD_SETSIZE, &fdtest, NULL, NULL, NULL); if (ret == -1) { break; }
for (int i = 0; i < FD_SETSIZE; i++)
if (FD_ISSET(i, &fdtest)) { if (i == listener) { // Co ket noi
int client = accept(listener, NULL, NULL);
if (client >= FD_SETSIZE) { close(client); } else { FD_SET(client, &fdread);
printf("New client connected: %d\n", client); } } else { // Co du lieu truyen den int client = i;
ret = recv(client, buf, sizeof(buf), 0);
if (ret <= 0) { close(client); FD_CLR(client, &fdread); } else { buf[ret] = 0;
printf("Received from %d: %s\n", client, buf); lOMoAR cPSD| 61549570 } } } } return 0; } //chat_server #include #include #include #include #include #include #include #include
int remove_client(int client, int *client_sockets, char **client_names, int *num_clients) { int i = 0;
for (; i < *num_clients; i++)
if (client_sockets[i] == client) break; if (i < *num_clients) {
if (i < *num_clients - 1) {
client_sockets[i] = client_sockets[*num_clients - 1];
strcpy(client_names[i], client_names[*num_clients - 1]); } lOMoAR cPSD| 61549570
free(client_names[*num_clients - 1]); *num_clients -= 1; } } int main() { // Tao socket cho ket noi
int listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listener == -1) { perror("socket() failed"); return 1; }
// Khai bao dia chi server struct sockaddr_in
addr; addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(9000);
// Gan socket voi cau truc dia chi
if (bind(listener, (struct sockaddr *)&addr, sizeof(addr))) {
perror("bind() failed"); return 1; }
// Chuyen socket sang trang thai cho ket noi
if (listen(listener, 5)) { perror("listen() failed"); return 1; } fd_set fdread, fdtest; FD_ZERO(&fdread);
// Gan socket listener vao fdread
FD_SET(listener, &fdread); char buf[256]; lOMoAR cPSD| 61549570
// Mang luu tru cac client da dang nhap
int client_sockets[FD_SETSIZE]; char
*client_names[FD_SETSIZE]; int num_clients = 0; while (1) { fdtest = fdread;
int ret = select(FD_SETSIZE, &fdtest, NULL, NULL, NULL); if (ret == -1) { break; }
for (int i = 0; i < FD_SETSIZE; i++)
if (FD_ISSET(i, &fdtest)) { if
(i == listener) { // Co ket noi
int client = accept(listener, NULL, NULL);
if (client >= FD_SETSIZE) { close(client); } else { FD_SET(client, &fdread);
printf("New client connected: %d\n", client); } } else { // Co du lieu truyen den int client = i;
ret = recv(client, buf, sizeof(buf), 0);
if (ret <= 0) { close(client); FD_CLR(client, &fdread);
// Xoa client ra khoi mang dang nhap lOMoAR cPSD| 61549570
remove_client(client, client_sockets, client_names, &num_clients); continue; } // In ra man hinh server buf[ret] = 0;
printf("Received from %d: %s\n", client, buf);
// Kiem tra trang thai dang nhap int j = 0;
for (; j < num_clients; j++) if
(client_sockets[j] == client) break;
if (j == num_clients) { // Chua dang nhap
char cmd[16], id[32], tmp[32]; int n =
sscanf(buf, "%s %s %s", cmd, id, tmp); if (n == 2) {
if (strcmp(cmd, "client_id:") == 0) {
// Kiem tra id da ton tai chua int k = 0;
for (; k < num_clients; k++)
if (strcmp(client_names[k], id) == 0)
break; if (k < num_clients) { // id da ton tai
char *msg = "ID da ton tai. Hay nhap ID khac\n";
send(client, msg, strlen(msg), 0); } else { // id chua ton tai
char *msg = "Dang nhap thanh cong.\n";
send(client, msg, strlen(msg), 0); lOMoAR cPSD| 61549570
// Chuyen client sang trang thai dang nhap
client_sockets[num_clients] = client;
client_names[num_clients] = malloc(strlen(id) + 1);
memcpy(client_names[num_clients], id, strlen(id) + 1);
// strcpy(client_names[num_clients], id); num_clients++; } } else {
char *msg = "Sai cu phap. Hay nhap lai.\n";
send(client, msg, strlen(msg), 0); } } else {
char *msg = "Sai cu phap. Hay nhap lai.\n";
send(client, msg, strlen(msg), 0); } } else { // Da dang nhap char receiver[32]; sscanf(buf, "%s", receiver);
if (strcmp(receiver, "all") == 0) {
// Chuyen tiep tin nhan cho cac client da dang nhap khac
for (int k = 0; k < num_clients; k++) if
(client_sockets[k] != client) { char msg[512];
sprintf(msg, "%s: %s\n", client_names[j], buf + strlen(receiver) + 1);
send(client_sockets[k], msg, strlen(msg), 0); lOMoAR cPSD| 61549570 } } else {
// Chuyen tiep tin nhan cho mot client
for (int k = 0; k < num_clients; k++)
if (strcmp(client_names[k], receiver) == 0) { char msg[512];
sprintf(msg, "%s: %s\n", client_names[j], buf + strlen(receiver) + 1);
send(client_sockets[k], msg, strlen(msg), 0); } }} }} } return 0; }
//telnet_sẻver #include #include #include #include #include #include #include #include int main() { // Tao socket cho ket noi
int listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listener == -1) { perror("socket() failed"); return 1; } lOMoAR cPSD| 61549570 // Khai bao dia chi server
struct sockaddr_in addr; addr.sin_family =
AF_INET; addr.sin_addr.s_addr =
htonl(INADDR_ANY); addr.sin_port =
htons(8000); // Gan socket voi cau truc dia chi
if (bind(listener, (struct sockaddr *)&addr, sizeof(addr))) {
perror("bind() failed"); return 1; }
// Chuyen socket sang trang thai cho ket noi
if (listen(listener, 5)) { perror("listen() failed"); return 1; } fd_set fdread, fdtest; FD_ZERO(&fdread);
// Gan socket listener vao fdread
FD_SET(listener, &fdread); int
client_sockets[FD_SETSIZE]; int num_clients = 0; char buf[256]; while (1) { fdtest = fdread;
int ret = select(FD_SETSIZE, &fdtest, NULL, NULL, NULL); if (ret == -1) { break; }
for (int i = 0; i < FD_SETSIZE; i++)
if (FD_ISSET(i, &fdtest)) { if
(i == listener) { // Co ket noi lOMoAR cPSD| 61549570
int client = accept(listener, NULL, NULL);
if (client >= FD_SETSIZE) { close(client); } else { FD_SET(client, &fdread);
printf("New client connected: %d\n", client); } } else { // Co du lieu truyen den int client = i;
ret = recv(client, buf, sizeof(buf), 0);
if (ret <= 0) { close(client); FD_CLR(client, &fdread); continue; } buf[ret] = 0;
printf("Received from %d: %s\n", client, buf); int j = 0;
for (; j < num_clients; j++) if (client_sockets[j] == client) break; if (j == num_clients) { // Chua dang nhap
char user[32], pass[32], tmp[65], line[65];
int n = sscanf(buf, "%s %s %s", user, pass, tmp); if (n != 2) { lOMoAR cPSD| 61549570
char *msg = "Sai cu phap. Hay nhap lai.\n";
send(client, msg, strlen(msg), 0); } else {
// Kiem tra thong tin dang nhap
sprintf(tmp, "%s %s\n", user, pass);
FILE *f = fopen("accounts.txt", "r"); int found = 0;
while (fgets(line, sizeof(line), f) != NULL) {
if (strcmp(tmp, line) == 0) { found = 1; break; } } if (found) {
char *msg = "Dang nhap thanh cong.\n";
send(client, msg, strlen(msg), 0); // Luu thong tin dang nhap
client_sockets[num_clients] = client; num_clients++; } else {
char *msg = "Dang nhap that bai. Hay nhap lai.\n";
send(client, msg, strlen(msg), 0); } fclose(f); } } else { // Da dang nhap char cmd[300]; lOMoAR cPSD| 61549570
// Xoa ky tu xuong dong o cuoi buf
if (buf[strlen(buf) - 1] == '\n') buf[strlen(buf) - 1] = 0; // Thuc hien lenh
sprintf(cmd, "%s > out.txt", buf); system(cmd);
// Tra lai ket qua cho client
FILE *f = fopen("out.txt", "rb"); while (1) {
int n = fread(buf, 1, sizeof(buf), f); if (n <= 0) break; send(client, buf, n, 0); } fclose(f); } } } } return 0; }
//multiprocess_server.c #include #include #include #include #include lOMoAR cPSD| 61549570 #include #include #include #include
void signalHanlder(int signo) { pid_t pid = wait(NULL);
printf("Child process terminated, pid = %d\n", pid); } int main() { // Tao socket cho ket noi
int listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listener == -1) { perror("socket() failed"); return 1; }
// Khai bao dia chi server struct sockaddr_in
addr; addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(8000);
// Gan socket voi cau truc dia chi
if (bind(listener, (struct sockaddr *)&addr, sizeof(addr))) {
perror("bind() failed"); return 1; }
// Chuyen socket sang trang thai cho ket noi
if (listen(listener, 5)) { perror("listen() failed"); return 1; } lOMoAR cPSD| 61549570
signal(SIGCHLD, signalHanlder); while (1) {
printf("Waiting for new client\n"); int client =
accept(listener, NULL, NULL); printf("New client
accepted, client = %d\n", client); if (fork() == 0) {
// Tien trinh con, xu ly yeu cau tu client // Dong socket listener close(listener); char buf[256]; while (1) {
int ret = recv(client, buf, sizeof(buf), 0); if (ret <= 0) break; buf[ret] = 0; printf("Received: %s", buf); } // Ket thuc tien trinh con exit(0); }
// Dong socket client o tien trinh cha close(client); } return 0; }