Server
1. Pasang socket dengan socket().
2. Buka port komunikasi, dengan bind ().
3. Dengarkan socket dengan listen().
4. Dalam looping, terima hubungan client dengan accept().
5. Buat child dari program dengan fork() agar dapat melayani banyak client sekaligus, masing-masing child akan melayani satu client.
6. Kirim pesan dengan send().
7. Tutup socket dengan close() atau shutdown().
8. Akhiri child process dengan exit().
2. Buka port komunikasi, dengan bind ().
3. Dengarkan socket dengan listen().
4. Dalam looping, terima hubungan client dengan accept().
5. Buat child dari program dengan fork() agar dapat melayani banyak client sekaligus, masing-masing child akan melayani satu client.
6. Kirim pesan dengan send().
7. Tutup socket dengan close() atau shutdown().
8. Akhiri child process dengan exit().
contoh:
/* serverteman.c */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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;
{
struct sockaddr_in alamat_serv;
struct sockaddr_in alamat_clie;
unsigned no_port;
int socketfd;
if (argc != 2) {
fprintf (stderr, “gunakan: %s \n”, argv[0]);
exit(1);
}
fprintf (stderr, “gunakan: %s \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);
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);
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);
}
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);
* koneksi maksimal dilayani sebanyak KONEKSI_MAKSIMAL
*/
listen (socketfd, KONEKSI_MAKSIMAL);
while(1) {
int client_size = sizeof (struct sockaddr_in);
int newfd;
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;
}
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));
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*/
pada parent process, fork() menghasilkan nilai pid dari child yang diciptakan*/
if (!fork ()) {
/* child process */
/* child process */
/* peringatan !, variabel buffer hanya menampung 255 karakter */
char buffer[256];
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);
}
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;
}
}
/* serverteman.c */
ok sekarang kita compile:
gcc -o serverteman serverteman.c
gcc -o serverteman serverteman.c
lalu jalankan:
./serverteman 1024
./serverteman 1024
mudah-mudahan serverteman sudah jalan.
catatan: untuk menjalankannya, jika anda bukan root port yang bisa ‘buka’ adalah >= 1024.
nah jika teman-teman mau mencoba ‘layanan’ serverteman, karena kita belum membuat program client-nya, telnet dapat kita gunakan.
telnet 127.0.0.1 1024
coba lihat pada terminal yang menjalankan client,
Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is ‘^]’.
Halo Teman, selamat datang di Server.Teman
Connection closed by foreign host.
Connected to 127.0.0.1.
Escape character is ‘^]’.
Halo Teman, selamat datang di Server.Teman
Connection closed by foreign host.
lalu coba lihat pada terminal yang menjalankan serverteman,
Teman dari 127.0.0.1 telah datang
Client
1. pasang dengan socket().
2. dapatkan alamat server dengan gethostbyname().
3. terima seluruh data yang dikirmkan dalam looping dengan recv().
4. tutup koneksi dengan close().
2. dapatkan alamat server dengan gethostbyname().
3. terima seluruh data yang dikirmkan dalam looping dengan recv().
4. tutup koneksi dengan close().
contoh:
/* clienteman.c */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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];
{
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 \n”, argv[0]);
exit(1);
}
fprintf (stderr, “gunakan: %s \n”, argv[0]);
exit(1);
}
if ((socketfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
fprintf (stderr, “tidak bisa memasang socket !\n”);
exit(1);
}
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]);
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);
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);
}
fprintf(stderr, “%s: tidak dapat melakukan koneksi\n”, argv[0]);
exit(1);
}
while((baca = recv(socketfd, buffer, strlen(buffer), 0)) > 0) {
printf(“%s”, buffer);
}
printf(“%s”, buffer);
}
close (socketfd);
return 0;
}
return 0;
}
/* clienteman.c */
lalu kita compile:
gcc -o clienteman clienteman.c
jalankan:
./clienteman 127.0.0.1 1024
nomor ip dan port sesuaikan dengan server tujuan.
nah artikel-nya sampe disini dulu.
jika teman-teman ingin belajar lebih jauh tentang socket programming,
ada banyak sekali artikel lain tentang socket programming, coba cari di search engine.
gcc -o clienteman clienteman.c
jalankan:
./clienteman 127.0.0.1 1024
nomor ip dan port sesuaikan dengan server tujuan.
nah artikel-nya sampe disini dulu.
jika teman-teman ingin belajar lebih jauh tentang socket programming,
ada banyak sekali artikel lain tentang socket programming, coba cari di search engine.

0 komentar:
Posting Komentar