Pertemuan 2 Socket Introduction Matakuliah : T0483 / Network Programming

advertisement
Matakuliah
Tahun
Versi
: T0483 / Network Programming
: 2008
: 2.0
Pertemuan 2
Socket Introduction
1
Learning Outcomes
Pada akhir pertemuan ini, diharapkan mahasiswa
akan mampu :
• menjelaskan konsep-konsep Sockets
pada Unix, Linux dan Windows
2
Outline Materi
•
•
•
•
•
•
•
•
•
Network API
Port
Socket history
Development Tools
Creating Sockets
Socket address structure
Byte Ordering
Network Byte Order
Byte manipulation function
• IPv4 Address Conversion
• Contoh program
3
Network API
• Network Application Programming
Interface (Network API).
– Pelayanan yang disediakan oleh sistem
operasi untuk menyediakan interface antara
software aplikasi dan protocol
4
Network API
5
Network API
• Network API
– Generic Programming Interface.
– Support for message oriented and connection
oriented communication.
– Work with existing I/O services
– Operating System independence.
• Generic Programming Interface
– Mendukung berbagai deretan protocol komunikasi
(families).
– Address (endpoint) representation independence.
– Provide special services for Client and Server
6
Network API
• TCP/IP
– TCP/IP tidak masuk dalam API definition
– Terdapat banyak macam API untuk menggunakan
protokol TCP/IP:
• Sockets (unix / linux)
• TLI, XTI ( unix )
• Winsock (windows)
• MacTCP
• Fungsi yang diperlukan:
– Menentukan local and remote communication
endpoints
– Initiate a connection
– Wait for incoming connection
– Send and receive data
– Terminate a connection
– Error handling
7
PORT NUMBER
• PORT Numbers
– Each TCP/IP machine has multiple logical
communication channels called ports
– Setiap saat banyak proses bisa menggunakan UDP
atau TCP.
– TCP atau UDP menggunakan 16-bit positip integer
Port Number untuk proses-proses yg berbeda tsb.
– Nomor Ports mulai dari 0 – 65536.
– Well known Port : 0 s/d 1023 dikontrol oleh IANA
(Internet Assigned Numbers Authority) . Contoh:
8
PORT NUMBER
Host A
Host B
Process
Process
Process
Process
Process
Process
9
PORT NUMBER
• Contoh:
–
–
–
–
–
–
–
–
–
Port 21 untuk FTP
Port 69 untuk TFTP
Port 7 untuk echo server
Port 9 untuk discard server
Port 13 untuk day time server
Port 19 untuk chargen server
Port 37 untuk Time
Port 79 untuk finger
Certain of these ports are ``well known''.
They are listed in the file /etc/services.
10
PORT NUMBER
• A connection between two machines is
uniquely defined by:
–
–
–
–
–
the protocol (TCP or UDP)
the IP address of local machine
the port number used on the local machine
the IP address of remote machine
the port number used on the remote machine
11
Socket History
12
SOCKETS
13
SOCKETS
• SOCKETS
– A socket is an abstract representation of a
communication endpoint.
– Sockets work with Unix I/O services just like
files, pipes & FIFOs.
14
Development Tools
• Programming Language
– Must support network programming APIs
– Disesuaikan dengan application requirements
– E.g., C, C++, Java, C#, Python, Visual Basic, etc.
• Operating System Platform
– Specific Platform
• Microsoft Windows, Mac OS, Unix/Linux
– Cross-Platforms
• Java, cross-platform library and application frameworks
• Network Programming API
– Sockets and its variants (e.g., BSD Sockets, Winsock)
– Transport Layer Interface (TLI in Unix)
– Kepemilikan API (e.g., Packet Driver)
15
Creating Sockets
• Creating a Socket
– Menggunakan System call Socket().
– Sintak :
int socket( family, type, protocol);
– family : protocol family seperti tabel dibawah.
– type : type of service / tipe protokol seperti tabel
dibawah
– protocol : specific protocol (biasanya 0, yang artinya
protocol yang digunakan seperti tabel dibawah).
– Header File :
#include <sys/types.h>
#include <sys/socket.h>
– Contoh:
• sd = socket(AF_INET, SOCK_STREAM, 0);
16
Creating Sockets
• Protocol Family
Description
17
Creating Sockets
18
Creating Sockets
• socket() system call
– The socket() system call returns a socket
descriptor (small integer) or a -1 on error.
– socket() allocates resources needed for a
communication endpoint
– TCP/IP requires an IP address and a port
number for each endpoint address.
19
Creating Sockets
POSIX Data Type
20
Creating Sockets
Generic Socket Address Structure:
<sys/socket.h>
struct sockaddr
uint8_t
sa_family_t
char
};
{
sa_len;
sa_family;
sa_data[14];
21
Creating Sockets
• socket address structure selalu di-pass
“by reference” jika sebagai argument
pada socket functions.
• Contoh:
int bind(int,struct sockaddr*,socklen_t)
struct sockaddr_in server;
/* IP4 */
bind(sockfd,(struct sockaddr *)&server,
sizeof(server));
22
Creating Sockets
• IP4 Socket Address Structure
struct sockaddr_in
uint8_t
sa_family_t
in_port_t
struct in_addr
char
};
{
sin_len;
sin_family;
sin_port;
sin_addr;
sin_zero[8];
struct in_addr {
in_addr_t s_addr;
};
– Alamat IP4 dan Nomor Port TCP atau UDP selalu disimpan
dalam stuktur network byte order.
23
Byte Ordering
• Arsitektur komputer yang berbeda bisa saja
menggunakan byte ordering yg berbeda untuk
merepresentasikan multibyte values.
• Contoh 16 bit bilangan integer (2 byte):
Low Byte
Address A
High Byte
High Byte
Address A+1
Low Byte
24
Byte Ordering
Little-Endian
Big-Endian
Low Byte
High Byte
High Byte
Low Byte
Addr A
Addr A+1
Addr A
Addr A+1
IBM 80x86
DEC VAX
DEC PDP-11
IBM 370
Motorola 68000
Sun
25
Byte Ordering
• Misalkan sebuah komputer yang menggunakan
konsep Big Endian mengirim data 16 bit integer
dengan nilai 2:
0000000000000010
• Sebuah komputer yang menggunakan konsep Little
Endian akan mengartikan data tersebut dengan nilai
512:
0000001000000000
26
Byte Ordering
Network Byte Order = Big-Endian Architecture
27
Network Byte Order
Network Byte Order
– Urutan byte yang sudah pasti, khususnya
untuk data yang lebih dari satu byte, dimana
LSB menempati lokasi/address memori yang
lebih besar dibandingkan MSB.
– Nilai yg disimpan pada “sockaddr_in” harus
dalam “network byte order”, seperti :
• sin_port : untuk menyimpan TCP atau UDP port
number.
• sin_addr : untuk menyimpan 32-bit IP4 address.
28
Network Byte Order
Network Byte Order Function
– Ada dua cara untuk menyimpan 2-byte data di
memori: little-endian and big-endian => Host
byte order.
– Fungsi-fungsi untuk meng-konversi dari host
byte order ke network byte order umumnya
diawali dengan huruf:
•
•
•
•
‘h’ : host byte order
‘n’ : network byte order
‘s’ : short (16bit)
‘l’ : long (32bit)
29
Network Byte Order
• Contoh Fungsi yg mengembalikan
Network Byte Order :
– uint16_t htons(uint16_t);
– uint32_t htonl(uint32_t);
• Contoh Fungsi yg mengembalikan Host
Byte Order :
- uint16_t ntohs(uint16_t);
- uint32_t ntohl(uint32_t);
30
Byte Manipulation Functions
Byte Manipulation Functions
#include <string.h>
– void bzero(void *dst, size_t nbytes);
– void bcopy(const void *src, void *dest, size_t nbytes);
– int bcmp(const void *ptr1, const void *ptr2, size_t nbytes);
Contoh:
#include <string.h>
main(){
char x[10]; int i;
for(i=0; i<10;i++) x[i]=65+i;
bzero(x,4);
for(i=0;i<10;i++) printf("%c\n",x[i]);
}
31
IPv4 Address Conversion
IPv4 Address Conversion
int inet_aton( char *, struct in_addr *);
• Fungsi inet_aton() berfungsi untuk mengkonversi “string dotteddecimal IP address” menjadi nilai 32-bit dalam format “network byte
order”. Fungsi ini mengembalikan nilai 1 jika sukses, dan
mengembalikan nilai 0 jika ada error.
char *inet_ntoa(struct in_addr);
• Fungsi inet_ntoa() berfungsi untuk mengkonversi nilai/alamat IP dlm
“network byte ordered” menjadi string “ dotted-decimal IP address”.
32
Contoh program
#include <stdio.h>
#include <sys/types.h>
int main()
{
union{
short s;
char c[sizeof(short)];
} un;
un.s=0x0102;
if(sizeof(short) == 2){
if(un.c[0]==1 && un.c[1]==2) printf("big-endian\n");
else if(un.c[0] == 2 && un.c[1] == 1)printf("littleendian\n");
else printf("unknown\n");
}
else printf("sizeof(short) = %d\n",sizeof(short));
return(0);
}
33
Contoh program
#include <stdio.h>
#include <netinet/in.h>
int main()
{
unsigned int a;
unsigned long int b;
printf("Network byte order = %x\n", a=htons(0x1234));
printf("Network byte order = %x\n", b=htonl(0x12345678));
printf("Host byte order = %x\n", ntohs(a));
printf("Host byte order = %x\n", ntohl(b));
return(1);
}
34
Contoh program
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
main()
{
unsigned long x;
char ss[80];
struct sockaddr_in ina;
x = inet_addr("10.21.42.95");
ina.sin_addr.s_addr=x;
printf("IP address (network byte order) : %ld\n",x);
strcpy(ss, inet_ntoa(ina.sin_addr));
printf("String dot-decimal IP address : %s\n",ss);
return(0);
}
35
Contoh program
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
char *addr1, *addr2;
struct sockaddr_in ina1, ina2;
ina1.sin_addr.s_addr = inet_addr("10.21.42.95");
ina2.sin_addr.s_addr = inet_addr("10.21.42.205");
addr1 = inet_ntoa(ina1.sin_addr);
addr2 = inet_ntoa(ina2.sin_addr);
printf("IP address : %s\n",addr1);
printf("IP address : %s\n",addr2);
return(0);
}
36
Contoh program
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
char addr1[80], addr2[80];
struct sockaddr_in ina1, ina2;
ina1.sin_addr.s_addr = inet_addr("10.21.42.95");
ina2.sin_addr.s_addr = inet_addr("10.21.42.205");
strcpy(addr1, inet_ntoa(ina1.sin_addr));
strcpy(addr2, inet_ntoa(ina2.sin_addr));
printf("IP address : %s\n",addr1);
printf("IP address : %s\n",addr2);
return(0);
}
37
Contoh program
inet_atoa():
• Merubah IP addressesdari string dots-decimal IP address ke struct in_addr
• Sintak: int inet_aton(const char *cp, struct in_addr *inp);
• Mengembalikan nilai non-zero jika sukses, dan return zero jika error.
#include
#include
#include
#include
<stdio.h>
<sys/socket.h>
<netinet/in.h>
<arpa/inet.h>
int main()
{
struct sockaddr_in addr;
inet_aton("192.168.90.25",&addr.sin_addr);
printf("IP=192.168.90.25\n");
printf("IP=%x.%x.%x.%x\n",192,168,90,25);
printf("addr=%d (desimal)\n",addr.sin_addr.s_addr);
printf("addr=%x (hexadesimal)\n",addr.sin_addr.s_addr);
return 0;
}
38
Contoh program
• Hasil:
IP=192.168.90.25
IP=c0.a8.5a.19
addr=425371840 (desimal)
addr=195aa8c0 (hexadesimal)
NB: inet_aton() sering tdk disupport
O/S tertentu => gunakan inet_addr()
inet_aton("192.168.90.25",&addr.sin_addr);
sama artinya dengan:
addr.sin_addr.s_addr = inet_addr("192.168.90.25");
39
LATIHAN
1. Sebuah komputer dengan arsitekturnya menggunakan byte ordering
little-endian, dan pada komputer tersebut dijalankan program, dan
didalam program terdapat statement x=htons(2);
berapakah nilai x ?
2. Sebuah komputer dengan arsitekturnya menggunakan byte ordering
little-endian, dan pada komputer tersebut dijalankan program, dan
didalam program terdapat statement x=ntohs(2);
berapakah nilai x ?
3. Sebuah komputer dengan arsitekturnya menggunakan byte ordering
big-endian, dan pada komputer tersebut dijalankan program, dan
didalam program terdapat statement x=htons(2);
berapakah nilai x ?
4. Sebuah komputer dengan arsitekturnya menggunakan byte ordering
big-endian, dan pada komputer tersebut dijalankan program, dan
didalam program terdapat statement x=ntohs(2);
berapakah nilai x ?
40
Download