PENGENALAN SOKET APAKAH SOKET ITU 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 antarmuka pemograman pemograman jaringan. Digunakan untuk komunikasi antar proses lewat jaringan. Digunakan oleh sebuah proses untuk berkomunikasi dengan sebuah sistem jauh melalui sebuah protokol transport. sebuah IP address dan sebuah port number. Membutuhkan sebuah
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-DIRECTIONAL BI-DIRECTIONAL Sebuah soket menyediakan sebuah mekanisme directional. bersamaan/berbarengan Dua jalan secara bersamaan/berbarengan Juga dikenal sebagai komunikasi full dupleks (FDX)
komunikasi
bi-
PEMOGRAMAN SOKET Untuk menggunakan soket, seseorang memerlukan sebuah struktur untuk menangani alamat dan informasi port number terhubungnya. terhubungnya. Sebuah format soket umum adalah (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 SOCK_STREAM SOCK_DGRAM SOCK_SEQPACKET SOCK_RAW
Deskripsi Soket Stream (TCP) Soket Datagram (UDP) Soket Paket Terurut (SCTP) Soket Mentah (bicara dengan IP secara langsung)
MODEL CLIENT / SERVER
Permintaan Server
Client Respon
Mulai dan inisialisasi Pergi tidur menunggu client menghubungi Ketika dihubungi oleh client memanggil/menciptakan sebuah handler untuk menangani (Pergi tidur kembali : terjadi secara berbarengan) Menangani permintaan client, mengirim kembali jawaban…
Menutup koneksi dengan client (kembali tidur : iteratif)
Mulai dan inisialisasi Menunggu input pengguna Pada penerimaan permintaan pengguna, menghubungi server, mengirim permintaan bagi kepentingan pengguna Menunggu jawaban server, mengirim hasil ke pengguna, mengirimkan permintaan pengguna lainnya, 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. 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 IPv4 Sebuah struktur alamat soket IPv4 umumnya disebut sebuah “struktur alamat soket internet” dinamakan sock_addr_in dan didefinisikan dgn menyertakan header
. 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 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 implementasi mendukung field panjang, atau sebuah 16-bit unsigned integer bila tidak mendukung field panjang.
Tipe data
Deskripsi
Header
Int8_t Uint8_t Int_16_t Uint16_t Int32_t Unit32_t
signed 8-bit integer Unsigned 8-bit integer Signed 16-bit integer Unsigned 16-bit integer Signed 32-bit integer Unsigned 32-bit integer
Sa_family_t Address family of socket address structure Socklen_t Length of socket address structure, normalnya uint32_t In_addr_t IPv4 address, normalnya uint32_t In_port_t TCP atau UDP port, normalnya uint16_t
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.
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 . Struct in6_addr {
dengan
memasukkan
header
uint8_t s6_addr[16]; /* 128-bit IPv4 address*/ /* network byte order */ }; #define SIN6_LEN
/* required for compile-time test */
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 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 paketpaket yang tidak memiliki sebuah flow.
STRUKTUR ALAMAT SOKET UMUM Struktur 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 sbb : Struct sockaddr { uint8_t sa_len;
Sa_family_t char
sa_family; /*address family : AF_xxx value */ sa_data[14]; /* protocolspecific 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)
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 BYTE Misal 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 littleendian byte order. Atau Dengan high-order byte pada permulaan alamat dikenal sbg bigendian byte order. Little-endian byte order and big-endian byte order for a 16-bit integer increasing memory address
Little-endian byte order :
address A + 1 High-order byte
MSB
Big-endian byte order :
address A Low-order byte
16-bit value
High-order byte address A
LSB
Low-order byte 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 % byteorder power pc-ibm-aix4.2.0.0: big-endian alpha % byteorder alpha-dec-osf4.0: little –endian bsdi % byteorder sparc-sun-sunos1.4: big-endian
Terdapat sistem yang dapat berubah antara little-endian dengan bigendian 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 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 strukturstruktur 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
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 nilainilai 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.
FUNGSI-FUNGSI MANIPULASI BYTE Terdapat 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 fieldfield 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
void bzero (void *dest, size_t nbytes); void bcopy (const void *src, void *dest, size_t nbyyes); int bcmp (const void *ptrl, const void *ptr2, nbytes);
size_t
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.
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
void *memset (void *dest, int c, size_t len); void *memcpy (void *dest, const void *src, size_t nbyyes); int memcmp (const void *ptrl, const void *ptr2, size_t nbytes); 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_ntop Menangani konversi alamat IPv4 ataupun konversi alamat IPv6.
FUNGSI INET_ATON Mengkonversi 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_ADDR Mengerjakan 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 Mengkonversi sebuah alamat IPV4 binari 32-bit network byte-ordered ke dalam string desimal-bertitik yang berkorenspondensi dengannya.
include int inet_aton(const char *addr_ptr );
*strptr ,
struct
in_addr
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 maka kedua fungsi ini mengembalikan sebuah kesalahan dengan errno diatur ke EAFNOSUPPORT.
#include 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 family , const char *inet_ntop(int *addrptr , char *strptr , size_t len);
const
void
Return : pointer to result if OK, NULL on error
FUNGSI INET_PTON Mencoba menyelubungi string yang ditunjuk oleh strptr menyimpan hasil binari melalui pointer addrptr.
dan
Jika berhasil, nilai yang dikembalikan adalah 1. Jika input string bukanlah format presentasi yang valid untuk family tertentu maka nilai 0 dikembalikan.
FUNGSI INET_NTOP Fungsi 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 : #define INET_ADDRSTRLEN 16 /* for IPv4 dotted-decimal */ #define INET6_ADDRSTRLEN 46 /* for IPv6 hex string */
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 nbytes );
filedes, cont
ssize_t readline(int maxlen );
filedes,
void
void
*buff ,
*buff ,
size_t
size_t
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 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. Cat : terdapat bermacam-macam konstanta S_Ifxxx lainnya, yang didefinisikan dengan memasukkan header . Namun demikian, Posix.1g hanya menspesifikasikan bahwa fungsi ini bekerja ketika fdtype adalah S_IFSOCK.