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
iddanpasswordsaat register -> disimpan di fileakun.txtsebagaiid:password id2:password2
- Client diminta
iddanpasswordsaat login -> dicocokkan denganid:passwordyang 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
whileloop -
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
registerke Server -
Server menerima command dan menyiapkan file
akun.txtfp2 = 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 -
closefile dan akun telah diregister
-
- Fungsi login
-
Client mengirimkan command
loginke 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.tsvyang menyimpanpath file di server publisher tahunpublikasi
files.tsvdi-update setiap ada operasi add dan delete files - folder
FILESyang 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
FILESsetelah Server dijalankan
- buat folder
- tidak ada
- di Server terdapat
-
- file yang dikirim ke Server disimpan di folder
FILESFile1.ekstensi File2.ekstensi
- client mengirimkan command
adddan Client memasukkan detail filePublisher: Tahun Publikasi: Filepath:
files.tsvmenyimpan data file yang dikirimkan ke Server
- command
adddari 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.tsvdan 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.tsvjika 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.tsvtampilan 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.tsvremoveLine(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.tsvline-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.tsvline-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.logTambah : File1.ektensi (id:pass) Hapus : File2.ektensi (id:pass)
- log tiap add dan delete
- buat fungsi untuk memudahkan penambahan log di
running.logvoid 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
structtypedef 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














