Bab 3 Pengenalan Soket

24
PENGENALAN SOKET APAKAH SOKET ITU ? Sebuah soket adalah sebuah komunikasi end point. Equivalent terhadap sebuah antarmuka jaringan komputer (hardware). Mengizinkan sebuah aplikasi jaringan untuk “plug into” jaringan (tidak secara fisik, tapi secara metaphora/kiasan). Adalah sebuah antarmuka pemograman jaringan. Digunakan untuk komunikasi antar proses lewat jaringan. Digunakan oleh sebuah proses untuk berkomunikasi dengan sebuah sistem jauh melalui sebuah protokol transport. Membutuhkan sebuah IP address dan sebuah port number. SOKET BERASAL DARI BERKELAY UNIX Soket pertama kali diperkenalkan dalam UNIX berkelay Sebuah ekstensi (perluasan) dari abstraksi UNIX mengenai konsep I/O file. Sekarang umumnya di-support dalam hampir semua sistem operasi modern untuk komunikasi antar sistem. POPULER DALAM KOMPUTASI CLINT/SERVER Soket populer digunakan dalam komputasi client / server Menyediakan dua jenis utama layanan : Connection-Oriented Connectionless

Transcript of Bab 3 Pengenalan Soket

Page 1: Bab 3 Pengenalan Soket

PENGENALAN SOKET

APAKAH SOKET ITU ? Sebuah soket adalah sebuah komunikasi end point.

Equivalent terhadap sebuah antarmuka jaringan komputer (hardware).

Mengizinkan sebuah aplikasi jaringan untuk “plug into” jaringan (tidak secara fisik, tapi secara metaphora/kiasan).

Adalah sebuah antarmuka pemograman jaringan. Digunakan untuk komunikasi antar proses lewat jaringan. Digunakan oleh sebuah proses untuk berkomunikasi

dengan sebuah sistem jauh melalui sebuah protokol transport.

Membutuhkan sebuah IP address dan sebuah port number.

SOKET BERASAL DARI BERKELAY UNIX Soket pertama kali diperkenalkan dalam UNIX berkelay

Sebuah ekstensi (perluasan) dari abstraksi UNIX mengenai konsep I/O file.

Sekarang umumnya di-support dalam hampir semua sistem operasi modern untuk komunikasi antar sistem.

POPULER DALAM KOMPUTASI CLINT/SERVER Soket populer digunakan dalam komputasi client / server

Menyediakan dua jenis utama layanan : Connection-Oriented Connectionless

SOKET ADALAH BI-DIRECTIONALSebuah soket menyediakan sebuah mekanisme komunikasi bi-directional. Dua jalan secara bersamaan/berbarengan Juga dikenal sebagai komunikasi full dupleks (FDX)

PEMOGRAMAN SOKET Untuk menggunakan soket, seseorang memerlukan sebuah

struktur untuk menangani alamat dan informasi port number terhubungnya.

Sebuah format soket umum adalah

Page 2: Bab 3 Pengenalan Soket

(address family, address in the family)(keluarga alamat, alamat dalam keluarga)

Nama lain untuk keluarga (family) adalah domain.

STRUKTUR ALAMAT SOKET UMUM

Struct Sockaddr { sa_family_t sa_family; /*keluarga alamat*/char sa_data[14]; /*alamat soket*/

}

JENIS-JENIS SOKET

Keluarga DeskripsiSOCK_STREAM Soket Stream (TCP)SOCK_DGRAM Soket Datagram (UDP)SOCK_SEQPACKET

Soket Paket Terurut (SCTP)

SOCK_RAW Soket Mentah (bicara dengan IP secara langsung)

MODEL CLIENT / SERVER

PermintaanServer Client

Respon

Mulai dan inisialisasi Mulai dan inisialisasiPergi tidur menunggu client menghubungi

Menunggu input pengguna

Ketika dihubungi oleh client memanggil/menciptakan sebuah handler untuk menangani(Pergi tidur kembali : terjadisecara berbarengan)

Pada penerimaan permintaan pengguna, menghubungi server, mengirim permintaan bagi kepentingan pengguna

Menangani permintaan client, mengirim kembali

Menunggu jawaban server, mengirim hasil ke pengguna,

Page 3: Bab 3 Pengenalan Soket

jawaban… mengirimkan permintaan pengguna lainnya,

Menutup koneksi dengan client (kembali tidur : iteratif)

Menutup koneksi server

CONTOH 1 : TANPA KONEKSI (CONNECTIONLESS)

ALGORITMA SERVER (CONNECTIONLESS)a. Menciptakan sebuah soket.b. Mengikat ke alamat yang ditentukan sebelumnya bagi

layanan yang diinginkan.c. Menunggu sebuah datagram tiba dari client.d. Mengirimkan respon balikan ke client yang bersangkutan.e. Kembali ke (c) untuk client berikutnya.

ALGORITMA CLIENT (CONNECTIONLESS)a. Menciptakan sebuah soket.b. Mengirimkan sebuah datagram ke server.c. Menunggu respons dari server.d. Kembali ke (b) untuk datagram berikutnya.e. Menutup soket ketika tidak ada lagi datagram untuk

dikirimkan.

CONTOH2 : BERORINTASI KONEKSI

ALGORITMA SERVER (BERORIENTASI KONEKSI)a. Menciptakan sebuah soket.b. Mengikat ke alamat yang telah ditentukan sebelumnya untuk

layanan yang diinginkan.c. Menempatkan soket dalam mode pasif.d. Menerima permintaan koneksi berikutnya dari sebuah client.e. Membaca sebuah permintaan, memproses permintaan dan

mengirimkan kembali hasil-hasil.f. Menutup koneksi ketika selesai dengan sebuah client.g. Kembali ke (d) untuk client berikutnya.

ALGORITMA CLIENT (BERORIENTASI KONEKSI)a. Menciptakan sebuah soket.b. Menghubungkan soket ke server yang diinginkan.c. Mengirimkan sebuah permintaan dan menunggu respon.d. Mengulangi (c) hingga selesai.

Page 4: Bab 3 Pengenalan Soket

e. Memberitahukan server akan maksud untuk terminasi. Mungkin menutup R/W end baik secara terpisah maupun

secara bersama pada saat yang sama.f. Menutup soket (koneksi) ketika selesai.

STRUKTUR ALAMAT SOKET

Sebagian besar fungsi soket membutuhkan sebuah pointer ke sebuah struktur alamat soket sebagai sebuah argumen.Struktur alamat soket dapat dilalui dalam 2 arah :

Dari proses ke kernel Dari kernel ke proses

Setiap suita protokol yang didukung mendefinisikan struktur alamat soketnya. Nama dari struktur ini dimulai dengan sock_addr dan diakhiri dengan sebuah akhiran unik untuk setiap suita protokol.

STRUKTUR ALAMAT SOKET IPv4Sebuah struktur alamat soket IPv4 umumnya disebut sebuah “struktur alamat soket internet” dinamakan sock_addr_in dan didefinisikan dgn menyertakan header <netinet/in.h>.

Struct in_addr {In_addr_t s_addr; /* 32-bit IPv4 address */

};

struct sockaddr_in { uint8_t sin_len; /* length of structure(16) */ sa_family_t sin_family; /* AF_INET */ in_port_t sin_port; /* 16-bit TCP or UDP port

number *//* network byte ordered */

struct in_addr sin_addr; /* 32-bit IPv4 address*//* network byte ordered */

char sin_zero[8]; /*unused */};

Struktur Alamat Soket (IPv4) Internet : sockaddr_in

Page 5: Bab 3 Pengenalan Soket

Anggota dari panjang ; sin_len; ditambahkan dgn 4.3 BSD-Reno; jika dukungan untuk protokol-protokol OSI ditambahkan.Tidak semua vendor mendukung field panjang untuk struktur alamat soket & Posix.1g tidak membutuhkan anggota ini.Dengan memiliki sebuah field panjang akan menyederhanakan penanganan dari struktur alamat soket yang panjang-variabel.

Jika field panjang diadakan, kita tidak pernah perlu mengaturnya, dan tidak pernah perlu mengujinya, kecuali jika kita berurusan dengan soket-soket routing.

Catatan :Ke-4 fungsi soket ; bind, connect, send to, dan sendmsg; berfungsi untuk melewatkan sebuah struktur alamat soket dari proses ke kernel. Kesemuanya menyambungkan fungsi sockargs dalam implementasi Berkeley-derived.Lima fungsi soket yang berfungsi melewatkan sebuah struktur alamat soket dari kernel ke proses; accept, recvfrom, recvmsg, getpeername, dan getsockname; kesemuanya mengatur anggota sin_len sebelum mengembalikan ke proses.

Posix.1g hanya meminta 3 anggota dalam struktur : sin_family, sin_addr, dan sin_port.Bagi implementasi Posix-compliant, mendefinisikan anggota struktur tambahan adalah bisa diterima, sedangkan bagi sebuah struktur alamat soket Internet, hal ini adalah normal.Hampir seluruh implementasi menambahkan anggota sin_zero sehingga seluruh struktur alamat adalah paling tidak berukuran 16 byte.

Di sini ditampilkan tipe data Posix.1g untuk anggota-anggota s_addr, sin_family, dan sin_port.Tipe data in_addr_t harus sebuah tipe unsigned integer dari paling tidak 32 bit.In_port_t harus sebuah tipe unsigned integer dari paling tidak 16 bit.Sa_family_t dapat menjadi sembarang tipe unsigned integer, normalnya sebuah 8-bit unsigned integer bila

Page 6: Bab 3 Pengenalan Soket

implementasi mendukung field panjang, atau sebuah 16-bit unsigned integer bila tidak mendukung field panjang.

Tipe data Deskripsi HeaderInt8_t signed 8-bit integer <sys/types.h>Uint8_t Unsigned 8-bit integer <sys/types.h>Int_16_t Signed 16-bit integer <sys/types.h>Uint16_t Unsigned 16-bit integer <sys/types.h>Int32_t Signed 32-bit integer <sys/types.h>Unit32_t Unsigned 32-bit integer <sys/types.h>Sa_family_t Address family of socket

address structure<sys/socket.h>

Socklen_t Length of socket address structure, normalnya uint32_t

<sys/socket.h>

In_addr_t IPv4 address, normalnya uint32_t

<netinet/in.h>

In_port_t TCP atau UDP port, normalnya uint16_t

<netinet/in.h>

Ke-2 alamat IPv4 dan TCP atau UDP port number selalu disimpan dalam sebuah struktur dalam network byte order. Kita harus menyadarinya ketika menggunakan anggota-anggota ini.

Alamat IPv4 32-bit dapat diakses dalam 2 cara berbeda. Contoh : jika serv ditentukan sebagai struktur alamat soket Internet, lalu serv.sin_addr merekomendasikan alamat IPv4 32-bit sebagai sebuah struktur in_addr, sementara serv.sin_addr.s_addr merekomendasikan alamat IPv4 32-bit yang sama sebagai sebuah in_addr_t (khususnya sebuah integer 32-bit unsigned) kita harus pastikan bahwa kita mereferensi alamat IPv4 dengan benar, khususnya ketika ia digunakan sebagai sebuah argumen untuk suatu fungsi, karena kompilator seringkali menyuguhkan struktur dari integer dengan cara berbeda.

Anggota sin_zero tidak digunakan tapi kita selalu mengaturnya ke nol ketika mengisi satu dari struktur-struktur ini. Berdasarkan konvensi, kita selalu mengatur keseluruhan struktur ke nol sebelum mengisinya, bukan hanya anggota sin_zero.

Page 7: Bab 3 Pengenalan Soket

Struktur alamat soket digunakan hanya pada host yang diberikan : struktur itu sendiri tidak mengkomunikasikan antara host-host berbeda meskipun field-field tertentu (misalnya alamat IP dan port) digunakan untuk komunikasi.

STRUKTUR ALAMAT SOKET IPv6 Alamat soket IPv6 ditentukan dengan memasukkan header <netinet/in.h>.

Struct in6_addr {uint8_t s6_addr[16]; /* 128-bit IPv4 address*/

/* network byte order */};

#define SIN6_LEN /* required for compile-timetest */

struct sockaddr_in6 { uint8_t sin6_len; /* length of this struct

(24) */ sa_family_t sin6_family; /* AF_INET6 */ in_port_t sin6_port; /* transport layer

port# */ /* network byte ordered */

uint32_t sin6_flowinfo; /* priority & flow label */

/* network byte ordered */ struct in6_addr sin_addr;

/* 32-bit IPv4 address*//* network byte ordered */

};

Struktur Alamat Soket IPv6 : sockaddr_in6

Konstanta sin6_len harus ditentukan jika sistem mendukung anggota panjang untuk struktur alamat soket.

Keluarga IPv6 adalah AF_INET6, sedangkan keluarga IPv4 adalah AF_INET.

Anggota sin6_flowinfo dibagi ke dalam 3 field : Low-order 24 bit adalah flow label 4 bit berikutnya adalah prioritas

Page 8: Bab 3 Pengenalan Soket

4 bit berikutnya adalah dicadangkan.Penggunaan field prioritas masih sebuah topik penelitian.Flow label 24-bit dapat dipilih secara acak oleh aplikasi bagi sebuah soket yang diberikan (pengggunaan field ini masih eksperiental). Sebuah flow adalah sebuah urutan dari paket-paket yang berasal dari sebuah sumber tertentu ke sebuah tujuan tertentu dimana sumber menginginkan penanganan khusus oleh router-router . Untuk sebuah flow yang diberikan, sekali flow label dipilih oleh sumber, ia tidak akan berubah. Sebuah 0 flow label (default) mengidentifikasi paket-paket yang tidak memiliki sebuah flow.

STRUKTUR ALAMAT SOKET UMUMStruktur alamat soket selalu dilintasi secara referensi ketika disuguhkan sebagai sebuah argumen ke sembarang fungsi soket manapun. Tetapi, fungsi-fungsi soket yang mengambil satu dari

pointer-pointer ini sebagai sebuah argumen harus berurusan dengan struktur alamat soket dari keluarga protokol yang didukung.

Fungsi-fungsi soket lebih tua dari ANSI C. Solusi yang dipilih bagi fungsi-fungsi soket adalah dengan

mendefinisikan sebuah struktur alamat soket umum dalam <sys/socket.h> sbb :

Struct sockaddr { uint8_t sa_len;

Sa_family_t sa_family; /*address family : AF_xxx value */

char sa_data[14]; /* protocol- specific address */

Struktur Alamat Soket Umum : sockaddr

Fungsi-fungsi soket lalu didefinisikan sebagai mengambil sebuah pointer ke struktur alamat soket umum.Contoh : Diperlihatkan di sini prototype fungsi C ANSI untuk fungsi bind :

int bind(int, struct sockaddr *, socklen_t)

Page 9: Bab 3 Pengenalan Soket

Ini membutuhkan bahwa panggilan manapun ke fungsi-fungsi ini yang harus mengkastakan pointer ke struktur alamat soket protokol-tertentu menjadi sebuah pointer ke sebuah struktur alamat soket umum. Contoh :Struct sockaddr_in serv; /* IPv4 socket address

structure *//*fill in serv{} */bind (sockfd, (struct sockaddr *) &serv,

sizeof(serv));

Dari sudut pandang seorang pemrogram aplikasi, satu-satunya penggunaan dari struktur alamat soket ini adalah mengkastakan pointer ke struktur-struktur protokol-tertentu.

Catatan :Dari sudut pandang kernel, alasan lain untuk menggunakan pointer ke struktur alamat soket umum sebagai argumen-argumen adalah bahwa kernel harus mengambil pointer pemanggil, mengkastakannya ke sockaddr * dan lalu melihat nilai dari sa_family untuk menentukan tipe struktur.

FUNGSI-FUNGSI PENGURUTAN BYTEMisal terdapat sebuah integer 16-bit yang tersusun atas 2 byte. Terdapat 2 cara untuk menyimpan 2 byte memori : Dengan low-order byte pada permulaan alamat, dikenal sbg

little-endian byte order. Atau Dengan high-order byte pada permulaan alamat dikenal sbg

big-endian byte order.

Little-endian byte order and big-endian byte order for a 16-bit integer

increasing memory address

address A + 1 address ALittle-endian byte order :

High-order byte Low-order byte

Page 10: Bab 3 Pengenalan Soket

MSB 16-bit

value LSB

Big-endian byte order :

High-order byte Low-order byte

address A address A + 1

increasing memory address

Tidak terdapat standard antara ke-2 pengurutan byte ini. Kita mungkin saja menjumpai sistem yang menggunakan ke-2 format ini.

Pengurutan byte yang digunakan oleh sebuah sistem yang diberikan kita acu sebagai host byte order.

Contoh : Menjalankan suatu program to determine host byte order, diperoleh :

aix % byteorderpower pc-ibm-aix4.2.0.0: big-endian

alpha % byteorderalpha-dec-osf4.0: little –endian

bsdi % byteordersparc-sun-sunos1.4: big-endian

Terdapat sistem yang dapat berubah antara little-endian dengan big-endian byte order, baik ketika sistem di-reset (MIPS 2000) ataupun pada 1 titik saat program sedang berjalan (Intel i860).

Sebagai pemrogram jaringan, kita harus berurusan dengan pengurutan byte karena protokol-protokol jaringan harus menspesifikasikan sebuah network byte order. Contoh : dalam sebuah segmen TCP terdapat sebuag 16-bit port number dan sebuah 32-bit alamat IP. Tumpukan protokol pengirim dan penerima harus menyetujui pada urutan apa

Page 11: Bab 3 Pengenalan Soket

byte-byte dari field-field byte-jamak ditransmisikan. Protokol-protokol Internet menggunakan urutan byte big-endian untuk integer byte-jamak ini.

Field-field ke dan dari header-header protokol menyelamatkan kita dari kekhawatiran tentang detail ini. Tetapi baik sejarah maupun Posix 1g menspesifikasikan bahwa field-field tertentu dalam struktur-struktur alamat soket dipelihara dalam network byte order.

Letak keperdulian kita adalah mengkonversi antara host byte order dengan network byute order. Kita gunakan 4 fungsi berikut untuk mengkonversi antara 2 urutan byte ini.

Pada nama dalam fungsi ini h berarti host, n berarti network, s berarti short dan l berarti long.

#include <netinet/in.h>

uint16_t htons (uint16_t host16bitvalue) ;

uint32_t hton1 (uint32_t host32bitvalue) ;

Both return: value in network byte order

uint16_t ntohs (uint16_t net16bitvalue) ;

uint32_t ntoh1 (uint32_t net32bitvalue) ;

Both return: value in host byte order

Saat menggunakan fungsi-fungsi ini, kita tidak perduli tentang nilai-nilai aktual (big endian atau little endian) untuk host byte order dan network byte order. Apa yang harus kita lakukan adalah meyakini untuk memanggil fungsi-fungsi yang layak untuk mengkonversi sebuah nilai yang diberikan antara host dan network byte order.

Pada sistem-sistem yang memiliki pengurutan byte yang sama dengan protokol-protokol Internet (big-endian), ke-4 fungsi ini biasanya didefinisikan sebagai makro null.

Page 12: Bab 3 Pengenalan Soket

FUNGSI-FUNGSI MANIPULASI BYTETerdapat 2 kelompok fungsi yang beroperasi pada field-field multibyte, tanpa menerjemahkan data, dan tidak mengasumsikan bahwa data adalah sebuah string C null-terminated.Kita membutuhkan tipe-tipe fungsi ini saat berurusan dengan struktur alamat soket, karena kita butuh memanipulasi byte-byte nol yakni field-field ini bukanlah string karakter C.

Kelompok pertama fungsi memiliki nama dimulai dengan b (untuk byte).Berasal dari 4.2 BSD dan masih disediakan oleh hampir sistem manapun yang mendukung fungsi-fungsi soket.

Kelompok kedua fungsi memiliki nama dimulai dengan mem (untuk memori), adalah standard C ANSI dan disediakan oleh sembarang sistem yang mendukung sebuah pustaka C ANSI.

#include <strings.h>

void bzero (void *dest, size_t nbytes);

void bcopy (const void *src, void *dest, size_tnbyyes);

int bcmp (const void *ptrl, const void *ptr2, size_t nbytes);

Returns: 0 if equel, nonzero if unequal

Catatan :Ini adalah perjumpaan kita yang pertama kali dengan qualifier const C ANSI . Dalam 3 penggunaan di sini menunjukkan bahwa apa yang ditunjuk dengan kualifikasi ini, src, ptr1, dan ptr2, adalah tidak dimodifikasi oleh fungsi. Dengan kata lain : memori yang ditunjuk oleh konstanta pointer dibaca tapi tidak dimodifikasi oleh fungsi.

Page 13: Bab 3 Pengenalan Soket

bzero mengatur sejumlah byte ke nol di dalam tujuan. Kita sering menggunakan fungsi ini untuk menginisialisasi sebuah struktur alamat soket ke nol.

bcopy memindahkan sejumlah byte dari sumber ke tujuan. bcmp membandingkan 2 string byte yang berubah-ubah.

Nilai yang dikembalikan adalah nol jika 2 string byte adalah identik, selain itu adalah nonzero.

Fungsi-fungsi berikut adalah fungsi-fungsi C ANSI. memset mengatur sejumlah byte ke nilai c di dalam tujuan. memcpy adalah serupa dengan bcopy tapi urutan dari 2

argumen pointer di-swap.bcopy menangani dengan tepat field-field overlapping, sementara prilaku memcpy tidak ditentukan bila sumber dan tujuan overlap.Fungsi C ANSI memmove harus digunakan saat field-field overlap

memcp membandingkan 2 string byte yang berubah-ubah dan mengembalikan nol jika mereka identik. Jika tidak identik, nilai yang dikembalikan adalah baik lebih besar dari nol ataupun kurang dari nol bergantung pada apakah byte tak sebanding yang pertama yang ditunjuk oleh ptr1 adalah lebih besar dari ataukah kurang dari byte berkorespondensi yang ditunjuk oleh ptr2. pembandingan dikerjakan dengan mengasumsikan bahwa 2 byte tak sebanding tsb adalah unsigned char.

#include <strings.h>

void *memset (void *dest, int c, size_t len);

void *memcpy (void *dest, const void *src, size_tnbyyes);

int memcmp (const void *ptrl, const void *ptr2,size_t nbytes);

Page 14: Bab 3 Pengenalan Soket

Returns: 0 if equal,<0 or >0 if unequal

FUNGSI-FUNGSI INET_ATON, INET_ADDR, DAN INET_NTOA

Fungsi konversi alamat merupakan fungsi yang mengkonversi alamat Internet antara string ASCII (yang lebih disukai manusia) dengan nilai binary network byte order (nilai yang disimpan dalam struktur alamat soket).

Terdapat 2 kelompok fungsi konversi alamat, yaitu : inet_aton, inet_ntoa, dan inet_addr

Mengkonversi sebuah alamat IPv4 antara string desimal-bertitik (misal : “206.62.226.33”) dengan nilai biner network byte-ordered.

inet_pton dan inet_ntopMenangani konversi alamat IPv4 ataupun konversi alamat IPv6.

FUNGSI INET_ATONMengkonversi string character (yang ditunjuk oleh str_ptr) ke dalam nilai binari 32-bit network byte-ordered (yang disimpan melalui pointer addrptr).Jika berhasil, nilai 1 dikembalikan. Sebaliknya nilai 0 dikembalikan. Jika addrptr adalah null pointer, fungsi masih membentuk

validasi dari string input-nya tapi tidak menyimpan hasil apapun.

FUNGSI INET_ADDRMengerjakan konversi yang sama, ia mengembalikan nilai binari 32-bit network byte-ordered. Fungsi mengembalikan konstanta INADDR_NONE (khususnya

32 one-bits) sebagai sebuah kesalahan. Ini artinya string bertitik desimal 255.255.255.255 (alamat broadcast terbatas IP) tidak dapat ditangani oleh fungsi ini, karena nilai binarinya muncul untuk mengindikasikan kegagalan fungsi.

Kode baru sebaiknya menggunakan inet_aton sebagai penggantinya ataupun fungsi lain yang lebih baru.

FUNGSI INET_NTOA

Page 15: Bab 3 Pengenalan Soket

Mengkonversi sebuah alamat IPV4 binari 32-bit network byte-ordered ke dalam string desimal-bertitik yang berkorenspondensi dengannya.

include <arpa/inet.h>int inet_aton(const char *strptr, struct in_addr *addr_ptr);

Return : 1 if string was valid, 0 on error

in_addr_t inet_addr(const char *strptr);

Return : 32-bit binary network byte ordered IPv4 address; INADDR_NONE if error

Char *inet_ntoa(struct in_addr inaddr);Return : Pointer to dotted-decimal string

String ditunjuk oleh nilai yang dikembalikan dari fungsi yang menetap di memori statis.

Fungsi ini mengambil sebuah struktur sebagai argumennya, bukan sebuah pointer ke struktur.

FUNGSI-FUNGSI INET_PTON DAN INET_NTOP

Kedua fungsi ini lebih baru daripada kelompok fungsi yang pertama dan dapat bekerja pada alamat IPv4 maupun alamat IPv6 .

Huruf p dan n berturut-turut berarti presentation dan numeric. Format presentasi untuk sebuah alamat yang seringkali

adalah sebuah string ASCII. Format numerik adalah nilai biner yang masuk ke sebuah

struktur alamat soket.

Argumen family untuk kedua fungsi ini adalah AF_INET (untuk IPv4) atau AF_INET6 (untuk IPv6). Jika family tidak didukung

Page 16: Bab 3 Pengenalan Soket

maka kedua fungsi ini mengembalikan sebuah kesalahan dengan errno diatur ke EAFNOSUPPORT.

#include <arpa/inet.h>

int inet_pton(int family, const char *strptr, void *addrptr);

Return : 1 if OK, 0 if input not a valid presentation format, -1 on error

const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);

Return : pointer to result if OK, NULL on error

FUNGSI INET_PTONMencoba menyelubungi string yang ditunjuk oleh strptr dan menyimpan hasil binari melalui pointer addrptr.Jika berhasil, nilai yang dikembalikan adalah 1. Jika input string bukanlah format presentasi yang valid untuk family tertentu maka nilai 0 dikembalikan.

FUNGSI INET_NTOPFungsi ini mengerjakan konversi sebaliknya dari numerik (addrptr) ke presentasi (strptr).

Argument len adalah ukuran dari tujuan, untuk mencegah fungsi overflowing buffer pemanggil. Untuk membantuk menspesifikasikan ukuran ini, 2 definisi

berikut ditentukan dengan memasukkan header <netinet/in.h> :

#define INET_ADDRSTRLEN 16 /* for IPv4 dotted-decimal */#define INET6_ADDRSTRLEN 46 /* for IPv6 hex string */

Page 17: Bab 3 Pengenalan Soket

Jika len terlalu kecil untuk menggenggam format presentasi yang dihasilkan; termasuk null terminasi; maka sebuah pointer null dikembalikan dan errno diatur ke ENOSPC.

Argument strptr ke inet_ntop tidak dapat menjadi pointer null. Pemanggil harus mengalokasikan memori untuk tujuan dan menspesifikasikan ukurannya. Jika berhasil, piinter ini adalah nilai yang dikembalikan oleh fungsi.

FUNGSI READN, WRITEN DAN READLINE

Soket-soket stream (misal : soket-soket TCP) memperlihatkan suatu prilaku terhadap fungsi read dan write yang berbeda dari prilaku terhadap file I/O normal.Sebuah read atau write pada sebuah soket stream mungkin lebih sedikit input dan output daripada yang dibutuhkan, tapi hal ini bukanlah suatu kondisi kesalahan. Alasannya adalah batas buffer mungkin dicapai bagi soket di dalam kernel hendaknya pemanggil meminta fungsi read atau write lagi untuk meng-input atau meng-output byte-byte sisa.

Disini disediakan 3 fungsi yang dapat digunakan kapanpun membaca dari atau menulis ke sebuah soket stream, sebagai alternatif dari penggunaan fungsi read atau fungsi write.

Fungsi readn membaca sejumlah n bytes dari sebuah descriptor

Fungsi writen menulis sejumlah n bytes ke sebuah descriptor

Fungsi readline membaca sebuah text line dari sebuah descriptor, 1 byte at a time

#include “unp.h”

ssize_t readn(int filedes, void *buff, size_t nbytes);

ssize_t writen(int filedes, cont void *buff, size_t nbytes);

ssize_t readline(int filedes, void *buff, size_t

Page 18: Bab 3 Pengenalan Soket

maxlen);

All return : number of bytes read or written, -1 on error

Ketiga fungsi ini mencari kesalahan EINTR (yaitu sebuah pemanggialn sistem diinterupsi oleh sebuah sinyal yang ditangkap) dan melanjutkan membaca atau menulis, jika kesalahan ini terjadi. Di sini kita menangani kesalahan, sebagai pengganti upaya memaksa pemanggil untuk memanggil read atau write lagi.

FUNGSI ISFDTYPE

Ada saat-saat dimana kita butuh untuk memeriksa sebuah descriptor untuk melihat apakah ia sebuah tipe tertentu.Sejarahnya, hal ini telah dikerjakan dengan memanggil fungsi fstat Posix.1 dan lalu menguji nilai st_mode yang dikembalikan dengan menggunakan salah satu dari makro S_Isxxx.Banyak implementasi, tapi tidak semua, mendefinisikan makro S_ISSOCK yang memeriksa apakah sebuah deskriptor adalah sebuah soket ataukah bukan.Karena terdapat beberapa implementasi yang tidak dapat mengatakan apakah sebuah deskriptor adalah sebuah soket hanya berdasarkan pada informasi yang dikembalikan oleh fungsi fstat, Posix.1g menyediakan fungsi yang lebih baru dari fungsi fstat, yaitu fungsi isfdtype.

#include <sys/stat.h>

int isfdtype(int fd, int fdtype);

Return : 1 if descriptor of specified type, 0 if not, -1 on error

Untuk menguji sebuah soket, fdtype adalah S_IFSOCK. Seseorang menggunakan fungsi ini dalam sebuah program yang di-exec oleh program lain untuk menguji apakah sebuah descriptor yang diharapkan adalah benar-benar sebuah soket.

Page 19: Bab 3 Pengenalan Soket

Cat : terdapat bermacam-macam konstanta S_Ifxxx lainnya, yang didefinisikan dengan memasukkan header <sys/stat.h>. Namun demikian, Posix.1g hanya menspesifikasikan bahwa fungsi ini bekerja ketika fdtype adalah S_IFSOCK.