Simple SCP

Tugas IF3292 Pemrograman Internet disuruh bikin yang beginian
SCP
Dari semua tugas sebelumnya

  1. HTML Editor with DHTML
  2. Simple CMS with PHP
  3. 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

  1. Mengambil file
    Ya gunanya untuk menyuruh remote-host untuk mengirimkan stream dari file yang kita minta
    get-tb.png
  2. Mengirim file
    Gunanya untuk mengirimkan file dari client ke remote-host
    put-tb.png
  3. Melist isi direktori
    Meminta remote-host untuk mengirim list dari isi direktori tertentu
    lst-tb.png
  4. Membuat direktori
    Meminta remote-host untuk membuat direktori baru tertentu
    mkd-tb.png
  5. Menghapus file/direktori
    Meminta remote-host untuk menghapus file atau direktori
    dlt-tb.png

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 ^_^

7 thoughts on “Simple SCP”

Leave a Reply