Jaring An
Jaring An
c
#include <stdio.h> #include <string.h> #include <unistd.h> #include <signal.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #define KONEKSI_MAKSIMAL 10 int main (int argc, char *argv[]) { struct sockaddr_in alamat_serv; struct sockaddr_in alamat_clie; unsigned no_port; int socketfd; if (argc != 2) { fprintf (stderr, "gunakan: %s <nomor_port>\n", argv[0]); exit(1); } no_port = atoi (argv[1]); socketfd = socket (AF_INET, SOCK_STREAM, 0); /* untuk membersihkan child process, yang telah selesai */ signal(SIGCHLD, SIG_IGN); /* kita reset terlebih dahulu variable alamat_serv */ bzero (&alamat_serv, sizeof(alamat_serv)); alamat_serv.sin_family = AF_INET; alamat_serv.sin_port = htons (no_port); /* macro INADDR_ANY menghasilkan current ip */ alamat_serv.sin_addr.s_addr = htonl (INADDR_ANY); /* buka port */ if (bind (socketfd, (struct sockaddr *)&alamat_serv, sizeof (struct sockaddr)) < 0) {
fprintf (stderr, "maaf ya, tidak bisa memasang port !\n"); exit(1); } printf ("serverteman menunggu teman datang ...\n"); /* menuggu koneksi yang masuk, * koneksi maksimal dilayani sebanyak KONEKSI_MAKSIMAL */ listen (socketfd, KONEKSI_MAKSIMAL); while(1) { int client_size = sizeof (struct sockaddr_in); int newfd; /* menerima koneksi yang datang */ newfd =accept (socketfd, (struct sockaddr *)&alamat_clie, &client_size); if(newfd == -1) { perror ("accept"); /* jika terjadi error akan looping lagi */ continue; } /* mengetahui siapa yang mengadakan koneksi */ printf("Teman dari %s telah datang\n", inet_ntoa (alamat_clie.sin_addr)); /* fork mengasilkan nilai return 0 pada child process, pada parent process, fork() menghasilkan nilai pid dari child yang diciptakan*/ if (!fork ()) { /* child process */ /* peringatan !, variabel buffer hanya menampung 255 karakter */ char buffer[256]; sprintf (buffer, "Halo Teman, selamat datang di Server.Teman\n"); /* kirim pesan */ if (send (newfd, buffer, strlen (buffer), 0) == -1) { perror ("send"); continue; } close (newfd); exit (0);
} else /* parent process, disini tidak dibutuhkan newfd, jadi sebaiknya ditutup. parent process akan looping lagi untuk menerima client yang lain*/ close (newfd); } return 0; } TCPclient.c #include <stdio.h> #include <string.h> #include <unistd.h> #include <signal.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <netinet/in.h> int main (int argc, char *argv[]) { struct sockaddr_in alamat_ku; struct sockaddr_in tujuan; struct hostent *host_server; int socketfd, connect_status, baca; int no_port; char buffer[256]; if (argc != 3) { fprintf (stderr, "gunakan: %s <alamat server > <nomor_port>\n", argv[0]); exit(1); } if ((socketfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { fprintf (stderr, "tidak bisa memasang socket !\n"); exit(1); } if ((host_server = gethostbyname(argv[1])) == NULL) { fprintf (stderr, "Nama host mungkin salah :)\n"); exit(1);
} no_port = atoi(argv[2]); bzero (&tujuan, sizeof(tujuan)); tujuan.sin_family = AF_INET; tujuan.sin_port = htons (no_port); memcpy ((char *)&tujuan.sin_addr.s_addr, host_server->h_addr_list[0], host_server>h_length); if ((connect_status = connect (socketfd, (struct sockaddr *)&tujuan, sizeof(tujuan))) < 0) { fprintf(stderr, "%s: tidak dapat melakukan koneksi\n", argv[0]); exit(1); } while((baca = recv(socketfd, buffer, strlen(buffer), 0)) > 0) { printf("%s", buffer); } close (socketfd); return 0; } Langkah-langkah Setting TCP server : Membuat socket TCP, dengan panggilan ke socket (). Binding soket ke port mendengarkan, dengan panggilan untuk mengikat (). Sebelum memanggil bind (), seorang programmer harus menyatakan struktur sockaddr_in, jelas itu (dengan memset ()), dan sin_family (AF_INET), dan mengisi ke sin_port (mendengarkan port, dalam urutan byte jaringan) bidang. Mengkonversi int pendek untuk jaringan urutan byte dapat dilakukan dengan memanggil fungsi htons () (host ke pendek jaringan). Menyiapkan socket untuk mendengarkan koneksi (menjadikannya mendengarkan soket), dengan panggilan untuk mendengarkan (). Menerima koneksi masuk, melalui panggilan untuk menerima (). Ini blok sampai sambungan masuk diterima, dan kemudian mengembalikan sebuah socket descriptor untuk sambungan yang diterima. Deskriptor awal tetap deskriptor mendengarkan, dan menerima () dapat dipanggil kembali setiap saat dengan soket ini, sampai tertutup. Berkomunikasi dengan host remote, yang dapat dilakukan melalui send () dan recv () atau write () dan read ().
Akhirnya penutupan setiap soket yang dibuka, setelah tidak lagi dibutuhkan, dengan menggunakan tutup (). Catatan bahwa jika ada panggilan ke fork (), setiap proses harus menutup soket itu tahu tentang (kernel melacak berapa banyak proses yang memiliki deskriptor terbuka), dan dua proses tidak boleh menggunakan soket yang sama sekaligus.
Langkah-langkah setting TCP client Menyiapkan klien TCP melibatkan langkah-langkah berikut: Membuat socket TCP, dengan panggilan ke socket (). Menyambung ke server dengan menggunakan koneksi (), melewati sebuah struktur sockaddr_in dengan sin_family diatur ke AF_INET, sin_port set ke port titik akhir adalah mendengarkan (dalam urutan byte jaringan), dan sin_addr set ke alamat IP mendengarkan server (juga dalam urutan byte jaringan.) Berkomunikasi dengan server dengan menggunakan send () dan recv () atau write () dan read (). Mengakhiri sambungan dan membersihkan dengan panggilan untuk menutup (). Sekali lagi, jika ada panggilan ke fork (), setiap proses harus menutup () soket.
OUTPUT PROGRAM
TCPServer.c
TCPClient.c
LAPORAN AKHIR
MATA PRAKTIKUM KELAS PRAKTIKUM KE TANGGAL MATERI NPM NAMA KETUA ASISTEN NAMA ASISTEN PARAF ASISTEN JUMLAH LEMBAR