Simple SCP
by Petra on May.14, 2008, under Intermezzo
Tugas IF3292 Pemrograman Internet disuruh bikin yang beginian

Dari semua tugas sebelumnya
- HTML Editor with DHTML
- Simple CMS with PHP
- Web Chess with AJAX
yang paling menarik yet paling susah yang ini……
disuruh bikin protokol sendiri….
tapi sebenarnya kalau dipikir-pikir konsepnya gak terlalu susah…. teknologinya aja yang ribet….
jadi intinya disuruh ngebikin program SCP-like dengan menggunakan socket programming di Linux…..
fungsinya cuman 2 : buat ngopi dan mindahin folder/file dari satu host ke host yang lain…
kalau untuk buat ngirim dan nerima data
file : client.c
#include <stdarg .h>
#include <stdio .h>
#include <errno .h>
#include <string .h>
#include <sys /socket.h>
#include <resolv .h>
#include <errno .h>
#define IP_DEST "127.0.0.1"
#define DEST_PORT 1311
#define MAXBUF 1024
int main(int argc, char * argv[]){
int sockfd; /* Socket file descriptor */
int bytes_read; /* Stream counter */
struct sockaddr_in dest; /* Internet socket handling structur */
char buffer[MAXBUF]; /* Buffer */
/* Open socket for streaming */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
perror("Socket");
return -1;
}
/* Initialize server address/port struct */
bzero(&dest, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(DEST_PORT);
if ( inet_aton(IP_DEST, &dest.sin_addr.s_addr) == 0 ){
perror(IP_DEST);
return -1;
}
/* Connect to server */
if ( connect(sockfd, (struct sockaddr*)&dest, sizeof(dest)) != 0 ){
return -1;
}
/* Sending message */
memset (buffer,'\0', MAXBUF);
strcpy(buffer, "Hello World, Server");
printf("SND : %s\n", buffer);
send(sockfd, buffer, strlen(buffer), 0);
/* Recieving message */
memset (buffer,'\0', MAXBUF);
recv(sockfd, buffer, MAXBUF, 0);
printf("RCV : %s\n", buffer);
printf("\n");
close(sockfd);
return 0;
}
file : server.c
#include <stdarg .h>
#include <stdio .h>
#include <errno .h>
#include <string .h>
#include <sys /socket.h>
#include <resolv .h>
#include <errno .h>
#define PORT_LISTEN 1311
#define MAXBUF 1024
int main(int argc, char * argv[]){
int sockfd; /* Socket file descriptor */
int bytes_read; /* Stream counter */
struct sockaddr_in self; /* Internet socket handling structur */
char buffer[MAXBUF]; /* Buffer */
/* Create streaming socket */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
perror("Socket");
exit(errno);
}
/* Initialize server address/port struct */
bzero(&self, sizeof(self));
self.sin_family = AF_INET;
self.sin_port = htons(PORT_LISTEN);
self.sin_addr.s_addr = INADDR_ANY;
/* Assign a port number to the socket */
if (bind(sockfd, (struct sockaddr*)&self, sizeof(self)) != 0){
perror("socket--bind");
exit(errno);
}
/* Make it a listening socket */
if (listen(sockfd, 20) != 0){
perror("socket--listen");
exit(errno);
}
/* Listening forever */
while(1){
int clientfd; /* Client file descriptor */
struct sockaddr_in client_addr;
int addrlen = sizeof(client_addr);
memset(buffer, '\0', MAXBUF);
/* Accepting connection, creating data pipe */
clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &addrlen);
/* Recieving data */
int msg_length = recv(clientfd, buffer, MAXBUF, 0);
printf("RCV : %s\n", buffer);
/* Sending back data */
strcpy(buffer, "Hello World too, Client");
printf("SND : %s\n", buffer);
send(clientfd, buffer, strlen(buffer), 0);
}
close(sockfd);
return 0;
}
kalau untuk kirim stream yang besar-besar ya gunakan file descriptornya saja, seakan-akan dia terus menulis
selanjutnya sih perkara protokol aja,
gimana sih si remote-host memahami arti dari pesan client-host ^_^
kalau untuk menyalin dan memindahkan file/folder jenis perintah yang dibutuhkan at least hanya 5
- Mengambil file
Ya gunanya untuk menyuruh remote-host untuk mengirimkan stream dari file yang kita minta

- Mengirim file
Gunanya untuk mengirimkan file dari client ke remote-host

- Melist isi direktori
Meminta remote-host untuk mengirim list dari isi direktori tertentu

- Membuat direktori
Meminta remote-host untuk membuat direktori baru tertentu

- Menghapus file/direktori
Meminta remote-host untuk menghapus file atau direktori

Kalau untuk menyalin sebuah file tinggal ambil file dari sebuah remote-host kemudian taruh file tersebut di remote-host yang lain. kalau untuk memindahkan ya tinggal terakhir suruh hapus filenya dari remote-host awal.
Kalau buat menyalin sebuah folder secara rekursif, tinggal secara rekursif meminta list dari isi direktori dan untuk semua direktori minta list isinya, kemudian minta remote-host yang satunya untuk membuat direktori, dan untuk semua file, salin filenya. ^_^
Seperti yang dibilang, kalau untuk keperluan sesederhana ini gak terlalu susah, sebenarnya.
Yang menjadi concern selanjutnya itu
- Autentikasi, siapa saja yang bisa menggunakan jalur tersebut
- Keamanan data, apakah data yang dikirim tidak bisa dipahami orang diluar jalur
- Integritas data, apakah data yang dikirim tidak bisa diubah
- Efisiensi pelayanan, bagaimana server bisa melayani dengan tepat, kaitannya dengan konkurensi dkk.
Kalau didalami lama-lama menyenangkan sepertinya ^_^
6 Comments for this entry
1 Trackback or Pingback for this entry
-
Simple SCP « Males Koding
February 12th, 2009 on 7:46 am[...] Simple SCP Ditulis pada Februari 12, 2009 oleh petra Diambil dari artikel lama di blog [...]
May 15th, 2008 on 6:45 am
dibilang SCP (Secure Copy) sih enggak sebenernya
rentan sama packet sniffing ini mah…. *sigh*
May 21st, 2008 on 7:23 am
Wah berbobot postingannya
*pakabar pet?
May 23rd, 2008 on 3:53 pm
Walah, mengapa baru baca ini setelah deadlinenya lama berlalu,.
(
May 26th, 2008 on 10:55 pm
lha ada si deni..
March 11th, 2009 on 11:36 am
mas, boleh minta socket.h nya gk? sekalian sama in.h, netdb.h
via email
makasih ya
March 11th, 2009 on 12:49 pm
header filenya udah bawaan linux semua