03-Socket Programming (Fungsi)
03-Socket Programming (Fungsi)
(FUNGSI)
SEMESTER GENAP 2019/2020
WHAT IS SOCKET ? (1)
Berkeley socket interface memperluas konsep file descriptor dengan sebuah socket descriptor
Seperti file, socket yang aktif dikenali oleh bilangan bulat yang dikenal sebagai socket descriptor-nya
Descriptor ini dialokasikan dalam cara yang sama seperti file descriptor, dalam tabel descriptor yang sama, oleh
proses
Sebuah aplikasi tidak dapat memiliki file descriptor dan socket descriptor dengan nilai yang sama
WHAT IS SOCKET ? (3)
Ketika sebuah aplikasi membuat file atau mulai bekerja dengan file yang ada, file descriptor dibuat
Descriptor ini adalah pointer ke struktur data yang menggambarkan file
Struktur data ini mungkin termasuk nama file, lokasi sebenarnya file pada disk atau dalam memori, apakah file tersebut
read-only atau read-write, dan ukuran file
Demikian juga, ketika aplikasi membuat socket, socket descriptor yang dibuat menunjuk ke struktur data yang
memegang informasi tentang socket
Informasi, mirip dengan file, berorientasi jaringan
Struktur data socket mencakup informasi seperti jenis socket, alamat lokal dan port yang digunakan oleh socket, dan
alamat remote dan port yang akan menerima komunikasi dari soket
Beberapa informasi ini mungkin tersedia dengan segera, dan beberapa mungkin diisi kemudian oleh function calls lain
WHAT IS SOCKET ? (4)
Dengan memperluas konsep file/file descriptor, tim UC Berkeley membuat file descriptor mudah untuk
memvisualisasikan komunikasi di dalam jaringan
Untuk berkomunikasi di jaringan, koneksi (socket) ke jaringan harus dibuka
Setelah socket dibuka, data dibaca dari atau ditulis ke socket
Ketika komunikasi selesai, koneksi ke jaringan ditutup dan sumber daya yang digunakan oleh socket dilepaskan
FUNGSI UTAMA PADA SOCKET
5 Control (ioctl) Set options seperti ukuran buffer dan tingkah laku koneksi
ALUR PEMANGGILAN FUNGSI
Server (Passive) Client (Active)
socket () socket()
bind () bind()
listen()
accept () connect()
write() read()
read() write()
close() close()
ALUR PEMANGGILAN FUNGSI
Server (Passive) Client (Active) • Pemanggilan fungsi pada client
• Aplikasi membuat socket dengan
socket () socket()
socket()
bind () bind() • Memanggil connect() untuk
menghubungi server
• Kemudian berinteraksi dengan server
listen()
dengan menggunakan write()
untuk mengirim permintaan ke server
accept () connect() • Dan read() untuk membaca
tanggapan dari server
write() read() • Jika client selesai, client memanggil
close().
read() write()
close() close()
ALUR PEMANGGILAN FUNGSI
Server (Passive) Client (Active) • Pemanggilan fungsi pada server
• Aplikasi membuat socket dengan socket()
socket () socket() • Kemudian memanggil bind() untuk menentukan
alamat dan port lokal yang digunakan
bind () bind() • Kemudian mulai memanggil listen() untuk
mengatur panjang antrian koneksi. Antrian koneksi
adalah jumlah permintaan bahwa aplikasi harus
listen() menunggu server untuk memproses permintaan saat
ini.
• Setelah antrian koneksi diatur, server memanggil
accept () connect() accept() dan menunggu hingga permintaan
sambungan berikutnya tiba dari client
write() read() • Ketika permintaan tiba, server menggunakan
read() dan write() untuk membaca
permintaan dan menulis tanggapan
read() write() • Setelah selesai, server memanggil close() untuk
mengakhiri koneksi ke client dan kembali ke fungsi
accept(), di mana server menunggu permintaan
close() close() sambungan berikutnya dari client
KONSTANTA SOCKET (1)
Seperti application programming interface (API) lainnya, socket interface menggunakan satu kumpulan
konstanta simbolik dan deklarasi struktur data yang telah ditetapkan
Ada dua set kumpulan dari konstanta yang digunakan dalam Berkeley socket interface: konstanta jenis protokol
(protocol type) dan konstanta keluarga alamat (address family)
Selain itu, tersedia sejumlah deklarasi struktur data standar
Konstanta, prototipe fungsi dan struktur data ini biasanya tersedia di file header
Dua file yang harus disertakan adalah
types.h dan socket.h
KONSTANTA SOCKET (2)
Argument Penjelasan
Family Protocol atau address family (AF_INET untukTCP/IP;
AF_UNIX untuk internal
Type Type of service (SOCK_STREAM untuk TCP;
SOCK_DGRAM untuk UDP)
Protocol Nomor protokol yang digunakan, biasanya default nol
(0)
STRUKTUR ALAMAT (1)
Berkeley socket interface menyediakan satu kumpulan struktur C yang terdefinisi yang membantu menangani
alamat endpoint yang berbeda dan tugas pemrograman socket lainnya
Mungkin struktur yang paling penting adalah struktur sockaddr_in
Tujuan struktur tersebut adalah untuk menyediakan cara standar penanganan alamat endpoint untuk komunikasi
jaringan
Struktur sockaddr_in berisi alamat IP dan nomor port protokol
STRUKTUR ALAMAT (2)
Struktur sockaddr_in
struct sockaddr_in{
short sin_family; /* type of address */
u_short sin_port; /* protocol port number */
/* network byte ordered */
struct in_addr sin_addr;
/* net address for the remote host */
/* network byte ordered */
char sin_zero[8];/* unused, set to zero */
};
sin_family: 2 byte- sin_addr: struct in_addr
sin_port: 2 byte - sin_zero: 8 byte (0)
STRUKTUR ALAMAT (3)
Struktur in_addr
// Internet address (a structure for historical reasons)
struct in_addr{
unsigned long s_addr;
// that’s a 32-bit long, or 4 bytes
};
s_addr: 4 byte (IP address)
STRUKTUR ALAMAT (4)
Banyak standar layanan TCP/IP seperti FTP, NTP, DNS, dan lain-lain menggunakan port standar, tidak bergantung
pada sistem operasi host
Port ini didefinisikan dalam file bernama /etc/services
Pada MS Windows dapat dilihat pada \windows\system32\drivers\etc\services
BYTE ORDER FUNCTION (1)
Protokol TCP/IP menentukan cara untuk merepresentasikan bilangan binary integer yang terdapat pada protocol
header
Bilangan binary interger tersebut harus dinyatakan dengan most significant byte terlebih dahulu network byte order
Fungsi ini bekerja pada 16-bit dan 32-bit integers. Fungsi : htons(), ntohs(), htonl(), dan
ntohl()
BYTE ORDER FUNCTION (2)
hton : convert integers from local host’s native byte order to network byte order.
ntoh : convert integers from network byte order to the local host’s native byte order
Fungsi yang diakhiri dengan:
socket() digunakan untuk membuat network endpoint, dan itu mengembalikan soket deskriptor yang
digunakan kemudian oleh fungsi lain
socket() mengembalikan -1 jika terjadi error. Sebaliknya, sebuah nilai yang dikembalikan adalah descriptor
dari socket. Contoh : mySocket=(AF_INET, SOCK_STREAM,0);
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
Fungsi bind() digunakan untuk bind (mengikat) socket ke sebuah alamat ketika socket dibuat
FUNGSI INTI/ FUNGSI UTAMA (2)
listen() digunakan untuk memberitahukan socket (yang telah dibuat) bahwa kita telah ready untuk menerima
koneksi, dan juga menentukan jumlah maximum koneksi yang boleh antri sebelum koneksi di tolak (refused)
backlog merupakan nilai yang menentukan antrian koneksi (connection queue). Nilai khas untuk backlog
adalah 5, meskipun bisa lebih besar sesuai kebutuhan.
int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
accept() mengambil socket descriptor, merupakan sebuah pointer to the address structure, dan panjang
(length) dari struct alamat sebagai parameternya
Hal utama yang perlu diingat dengan fungsi ini adalah bahwa fungsi ini biasanya akan berjalan dalam loop
tanpa akhir (endless loop)
FUNGSI INTI/ FUNGSI UTAMA (3)
write() menulis untuk menghitung byte dari isi buf ke deskriptor yang ditunjuk
int close(int fd)
Hal yang harus dilakukan pertama kali adalah close child socket sesegera mungkin setelah proses write ke client
selesai
Ingat !! :
Meskipun kita telah close socket ini, fungsi accept() adalah fungsi pemblokiran dan berada dalam sebuah
loop. Segera setelah child socket di close, program kita akan kembali melakukan looping dan menunggu koneksi
lain.
FUNGSI SOCKET LAINNYA (1)
read() akan menerima nbytes data dan menyimpannya dalam buffer buf
Jika pemanggilan fungsi read berhasil, akan mengembalikan jumlah aktual byte yang di baca. Jika komunikasi
berkahir akan mengembalikan 0. Sebaliknya –1.
FUNGSI IDENTIFIKASI (1)
Selain fungsi antarmuka soket inti, ada sejumlah fungsi lain yang dapat digunakan untuk mempermudah segala
hal pada pengembang.
fungsi integer conversion htons(), htonl(), ntohs(), and ntohl()
mempermudah untuk konversi strings ke IP addresses yang compatible dengan struct sockaddr
FUNGSI IDENTIFIKASI (2)
void bzero(void *s, size_t n): menulis jumlah null byte yang ditentukan ke tujuan yang ditentukan
uint16_t htons(uint16_t hostshort): mengonversi bilangan bulat dari local host byteorder asli byte
order jaringan dalam short integer
int inet_aton(const char *cp, struct in_addr *inp): mengonversi alamat internet host cp
dari IPv4 ke bentuk binary (dalam network byte order) dan menyimpannya di structure yang ditunjuk inp .
inet_aton() mengembalikan nilai nonzero jika alamat valid, 0 jika sebaliknya.
FUNGSI DAN STRUKTUR (2)
void perror(const char *str): mencetak pesan kesalahan deskriptif ke stderr. Pertama
string str dicetak diikuti oleh titik dua kemudian spasi.
errno: number of last error
ssize_t recv(int sockfd, void *buf, size_t len, int
flags): menerima pesan dari connection-mode atau connectionless-mode socket. Biasanya digunakan
dengan connection-mode soket karena tidak mengizinkan aplikasi untuk mengambil alamat sumber data yang
diterima.
FUNGSI DAN STRUKTUR (3)
struct sockaddr_in {
short sin_family; // e.g. AF_INET
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};
struct in_addr {
unsigned long s_addr; // load with inet_aton()
};
REFERENSI
Keir Davis, John W. Turner, dan Nathan Yocom, “The Definitive Guide to Linux Network Programming”, Apress, 2004
http://wiki.answers.com/Q/Bzero_function_in_socket_programming?#slide=1
http://linux.die.net/man/3/inet_aton
http://www.tutorialspoint.com/c_standard_library/c_function_perror.htm
http://man7.org/linux/man-pages/man3/errno.3. html
http://linux.die.net/man/3/recv
http://linux.die.net/man/3/read
http://linux.die.net/man/3/close
http:// linux.die.net/man/7/socket
http://www.gta.ufrj.br/ensino/eel878/sockets/sockaddr_inman.html
THANK YOU
[email protected]