Implementation of Socket in C | Part of Operating System (A) class of ITS
-
- Server dapat menerima lebih dari 1 koneksi Client sekaligus, namun hanya 1 Client yang dapat menggunakan fungsi-fungsi program. Client ke-2 dan seterusnya harus menunggu sampai Client pertama log out
- Client diminta
id
danpassword
saat register -> disimpan di fileakun.txt
sebagaiid:password id2:password2
- Client diminta
id
danpassword
saat login -> dicocokkan denganid:password
yang ada di fileakun.txt
- Konesi Client-Server
-
gunakan template koneksi socket Client dan Server yang ada di modul 3
-
manfaatkan thread untuk dapat memungkinkan terjadinya >1 koneksi Client ke Server
while(true) { if ((new_socket = accept(server_fd, (struct sockaddr *) &address, (socklen_t*) &addr_len)) < 0) { perror("accept"); exit(EXIT_FAILURE); } pthread_create(&(tid[total]), NULL, &client, &new_socket); total++; }
-
simpan jumlah Client yang sedang terkoneksi pada suatu variabel
-
tentukan apakah Client akan di terima atau di tahan aksesnya ke fungsi program berdasarkan jumlah koneksi
if (total == 1) { send(new_socket, hello, STR_SIZE, 0); } else { send(new_socket, deny, STR_SIZE, 0); }
-
di sisi Client, akan diperiksa pesan yang diterima dari Server
while (!equal(hello, buffer))
jika Server tidak mengirim pesan yang menandakan Client dapat menggunakan program, tunggu di
while
loop -
kembali di sisi Server, selain meng-handle Client pertama, buat Client tersebut untuk menunggu
while (total > 1) { valread = read(new_socket, buffer, STR_SIZE); if (total == 1) { send(new_socket, hello, STR_SIZE, 0); } else { send(new_socket, deny, STR_SIZE, 0); } }
tampilan di sisi Client
-
ketika meng-handle Client pertama, siapkan Server untuk menunggu command dari Client. Seperti: login, register, dst.
tampilan di sisi Client
-
ketika Client memutus koneksinya, decrement jumlah koneksi
else if (equal(quit, buffer)) { close(new_socket); total--; break; }
-
terima Client yang sedang menunggu apabila menjadi koneksi pertama
tampilan di sisi Client
-
- Fungsi register
-
Client mengirimkan command
register
ke Server -
Server menerima command dan menyiapkan file
akun.txt
fp2 = fopen("akun.txt", "a");
-
Client-Server kirim-terima username dan password yang ingin di-regist
tampilan di Client
-
fprintf
-kan user creds yang baru ke fileakun.txt
-
close
file dan akun telah diregister
-
- Fungsi login
-
Client mengirimkan command
login
ke Server -
Server menerima command
-
Client-Server kirim-terima username dan password
tampilan di Client
-
Server membuka file
akun.txt
-
Baca file line-by-line dan cari login credentials yang sesuai
while ((file_read = getline(&line, &len, fp3) != -1))
-
Kirim pesan ke Client apakah login berhasil atau tidak
-
Jika login berhasil, siapkan Client-Server untuk command add, download, dst.
tampilan di Client
-
- sulit untuk menerapkan fungsionalitas Client yang terkoneksi >1 dan ada Client yang harus menunggu
-
- di Server terdapat
files.tsv
yang menyimpanpath file di server publisher tahunpublikasi
files.tsv
di-update setiap ada operasi add dan delete files - folder
FILES
yang menyimpan semua file yang dikirimkan oleh Client, otomatis dibuat saat server dijalankan
files.tsv
- pada operasi penambahan file, tambahkan kode yang akan membuat file
files.tsv
- perubahan pada file tersebut akan dijelaskan lebih lanjut pada bagian soal selanjutnya
- pada operasi penambahan file, tambahkan kode yang akan membuat file
- folder
FILES
- buat folder
FILES
setelah Server dijalankan
- buat folder
- tidak ada
- di Server terdapat
-
- file yang dikirim ke Server disimpan di folder
FILES
File1.ekstensi File2.ekstensi
- client mengirimkan command
add
dan Client memasukkan detail filePublisher: Tahun Publikasi: Filepath:
files.tsv
menyimpan data file yang dikirimkan ke Server
- command
add
dari Client - pengiriman file ke Server
-
Client membuka file dan mengirimkan file ke Server
int fd = open(data, O_RDONLY); if (!fd) { perror("can't open"); exit(EXIT_FAILURE); } int read_len; while (true) { memset(data, 0x00, STR_SIZE); read_len = read(fd, data, STR_SIZE); if (read_len == 0) { break; } else { send(sock, data, read_len, 0); } } close(fd);
-
Server menerima file dan menyimpannya
int des_fd = open(request.path, O_WRONLY | O_CREAT | O_EXCL, 0700); if (!des_fd) { perror("can't open file"); exit(EXIT_FAILURE); }
Server bersiap untuk menyimpan file
struktur folder di Server
-
- penambahan detail file di
files.tsv
- Server menerima detail file terlebih dahulu
valread = read(new_socket, request.publisher, STR_SIZE); valread = read(new_socket, request.year, STR_SIZE); valread = read(new_socket, clientPath, STR_SIZE);
- Server memproses file path dari Client dan memodifikasinya agar dapat menyimpan file di
FILES/nama_file.extension
- Server membuka
files.tsv
dan menambahkan detail filefp = fopen("files.tsv", "a"); fprintf(fp, "%s\t%s\t%s\n", request.path, request.publisher, request.year); fclose(fp);
isi
files.tsv
- Server menerima detail file terlebih dahulu
- kesulitan mengerjakan soal
- file yang dikirim ke Server disimpan di folder
-
- Client dapat mendownload file yang ada di Server -> check di
files.tsv
- download file
-
Solusi dari download sangat serupa dengan solusi dari add, hanya saja peran Client-Server dibalik
-
Client mengirimkan command
download nama_file.extension
-
Server menerima command dan mencari nama file di
files.tsv
jika file bisa di-download
file tidak ada di Server
-
Server akan mengirimkan file ke Client jika ada file yang diminta
-
- kendala serupa dengan kendala di 1.c :)
- Client dapat mendownload file yang ada di Server -> check di
-
- Client mengirimkan command
delete nama_file.extension
- Jika file ada, file hanya di-rename menjadi
old-nama_file.extension
- Hapus file dari list pada
files.tsv
- Client send command
-
Client mengirimkan command delete dan nama file yang ingin di-delete
-
Server menerima command dan mengecek apakah ada file tersebut di
files.tsv
tampilan di Client apabila file ada dan telah terhapus
tampilan di Client apabila file tidak ada
tampilan di Client apabila Client ingin menghapus file yang telah dihapus
-
- Rename file
- jika ada file yang ingin dihapus, rename nama file
found = true; char old[] = "FILES/old-"; strcat(old, temp_entry.name); rename(temp_entry.path, old);
- jika ada file yang ingin dihapus, rename nama file
- Ubah
files.tsv
- selama membaca
files.tsv
, simpan pada baris ke-berapa terdapat detail dari file yang dihapus - buat fungsi untuk menghapus baris tertentu di
files.tsv
removeLine(index);
panggil fungsi
- fungsi merupakan modifikasi dari fungsi yang ditemukan di-web. Link tertera
- selama membaca
- tidak ada
- fungsi remove line di file https://www.w3resource.com/c-programming-exercises/file-handling/c-file-handling-exercise-8.php
- Client mengirimkan command
-
- Client mengirimkan command
see
- Format output di Client sebagai berikut:
Nama: Publisher: Tahun publishing: Ekstensi File : Filepath : Nama: Publisher: Tahun publishing: Ekstensi File : Filepath :
- Client mengirimkan command
see
- Client-Server kirim-terima command
- Server membuka
files.tsv
- Output di client
-
Server membaca
files.tsv
line-by-line -
Server memproses tiap line agar mendapatkan informasi yang diperlukan
-
Selama masih ada baris untuk diproses, kirim informasi ke Client
char message[STR_SIZE]; sprintf(message, "Nama : %s\nPublisher : %s\nTahun Publishing : %s\nEkstensi File : %s\nFilepath : %s\n\n", temp_entry.name, temp_entry.publisher, temp_entry.year, ext, temp_entry.path); send(new_socket, message, STR_SIZE, 0);
-
Client menerima informasi dari Server selama masih ada informasi untuk diterima
tampilan di Client
-
- Kesulitan bagaimana client dapat menerima file selama masih ada file untuk diterima dan berhenti ketika tidak ada informasi untuk diterima
- Client mengirimkan command
-
- Client menerima detail files yang mengandung string yang dikirimkan
- Format output sama dengan 1.f
- Client send command
- Client-Server kirim-terima
- Server membaca
files.tsv
line-by-line - Manfaatkan strstr agar sesuai dengan apa yang diminta soal
if ((h = strstr(temp_entry.name, buffer)) != NULL)
- Format output sama dengan 1.f
- lihat penjelasan di 1.f
- tidak paham cara pakai strstr
-
- tiap operasi add dan delete, log di
running.log
- format
running.log
Tambah : File1.ektensi (id:pass) Hapus : File2.ektensi (id:pass)
- log tiap add dan delete
- buat fungsi untuk memudahkan penambahan log di
running.log
void log_action(char *type, char *fileName, char *user, char *pass) { FILE *log; char action[16]; if (equal(type, "add")) { strcpy(action, "Tambah"); } else if (equal(type, "delete")) { strcpy(action, "Hapus"); } log = fopen("running.log", "a"); fprintf(log, "%s : %s (%s:%s)\n", action, fileName, user, pass); fclose(log); return; }
fungsi menerima apa tipe operasinya (add/delete), file apa yang terpengaruh, siapa yang melakukannya beserta passwordnya
- ketika Server memproses add dan delete, panggil fungsi tersebut
log_action("add", request.name, akun.name, akun.password);
panggil fungsi ketika terjadi file addition
log_action("delete", temp_entry.name, akun.name, akun.password);
panggil fungsi ketika terjadi deletion
- buat fungsi untuk memudahkan penambahan log di
- format
running.log
- tidak ada
- tiap operasi add dan delete, log di
-
demi pemudahan pengerjaan soal, dibuat beberapa
struct
typedef struct akun_t { char name[SIZE]; char password[SIZE]; } Account;
memudahkan login-register dan juga ketika log di 1.h
typedef struct file_t { char publisher[SIZE]; char year[SIZE]; char name[SIZE]; char path[SIZE]; } Entry;
memudahkan semua operasi yang berhubungan dengan file terutama ketika string processing