printfserver: got connection from s\n, inet_ntoatheir_addr.sin_addr;
if fork { this is the child process closesockfd; child doesn’t need the listener
if sendnew_fd, Hello, world\n, 14, 0 == -1 perrorsend;
closenew_fd; exit0;
} closenew_fd; parent doesn’t need this
} return 0;
}
Untuk mencoba program server tersebut jalankan:
telnet server 3490
8.2.3.2. Contoh Client Berbasis STREAM
client.c - a stream socket client demo include stdio.h
include stdlib.h include unistd.h
include errno.h include string.h
include netdb.h include systypes.h
include netinetin.h include syssocket.h
define PORT 3490 the port client will be connecting to define MAXDATASIZE 100 max number of bytes we can get at once
int mainint argc, char argv[] {
int sockfd, numbytes; char buf[MAXDATASIZE];
struct hostent he; struct sockaddr_in their_addr; connector’s address information
if argc = 2 { fprintfstderr,usage: client hostname\n;
exit1; }
if he=gethostbynameargv[1] == NULL { get the host info perrorgethostbyname;
exit1; }
if sockfd = socketAF_INET, SOCK_STREAM, 0 == -1 { perrorsocket;
exit1; }
their_addr.sin_family = AF_INET; host byte order their_addr.sin_port = htonsPORT; short, network byte order
their_addr.sin_addr = struct in_addr he-h_addr; memsettheir_addr.sin_zero, ’\0’, 8; zero the rest of the struct
if connectsockfd, struct sockaddr their_addr,sizeofstruct sockaddr == -1 {
perrorconnect; exit1;
} if numbytes=recvsockfd, buf, MAXDATASIZE-1, 0 == -1 {
perrorrecv; exit1;
}
buf[numbytes] = ’\0’; printfReceived: s,buf;
closesockfd; return 0;
}
Program ini mencari server dengan port 3490 dan menerima string dari server dan menampilkan ke layar.
8.2.3.3. Socket dengan DATAGRAM
Program listener akan bersiap pada sebuah mesin dan akan menunggu paket yang menuju ke port 4950. Program talker akan mengirim paket menuju ke port tersebut.
Listing program listernet :
listener.c - a datagram sockets server demo include stdio.h
include stdlib.h include unistd.h
include errno.h include string.h
include systypes.h include syssocket.h
include netinetin.h include arpainet.h
define MYPORT 4950 the port users will be connecting to define MAXBUFLEN 100
int mainvoid {
int sockfd; struct sockaddr_in my_addr; my address information
struct sockaddr_in their_addr; connector’s address information int addr_len, numbytes;
char buf[MAXBUFLEN]; if sockfd = socketAF_INET, SOCK_DGRAM, 0 == -1 {
perrorsocket; exit1;
} my_addr.sin_family = AF_INET; host byte order
my_addr.sin_port = htonsMYPORT; short, network byte order my_addr.sin_addr.s_addr = INADDR_ANY; automatically fill with my IP
memsetmy_addr.sin_zero, ’\0’, 8; zero the rest of the struct if bindsockfd, struct sockaddr my_addr,sizeofstruct sockaddr == -1
{ perrorbind;
exit1; }
addr_len = sizeofstruct sockaddr; if numbytes=recvfromsockfd,buf, MAXBUFLEN-1, 0,struct sockaddr
their_addr, addr_len == -1 { perrorrecvfrom;
exit1; }
printfgot packet from s\n,inet_ntoatheir_addr.sin_addr; printfpacket is d bytes long\n,numbytes;
buf[numbytes] = ’\0’; printfpacket contains \s\\n,buf;
closesockfd; return 0;
} Listing program talker:
talker.c - a datagram client demo include stdio.h
include stdlib.h include unistd.h
include errno.h include string.h
include systypes.h include syssocket.h
include netinetin.h include arpainet.h
include netdb.h define MYPORT 4950 the port users will be connecting to
int mainint argc, char argv[] {
int sockfd; struct sockaddr_in their_addr; connector’s address information
struct hostent he; int
numbytes; if argc = 3 {
fprintfstderr,usage: talker hostname message\n; exit1;
} if he=gethostbynameargv[1] == NULL { get the host info
perrorgethostbyname; exit1;
} if sockfd = socketAF_INET, SOCK_DGRAM, 0 == -1 {
perrorsocket; exit1;
} their_addr.sin_family = AF_INET; host byte order
their_addr.sin_port = htonsMYPORT; short, network byte order their_addr.sin_addr = struct in_addr he-h_addr;
memsettheir_addr.sin_zero, ’\0’, 8; zero the rest of the struct if numbytes=sendtosockfd, argv[2], strlenargv[2], 0,struct sockaddr
their_addr, sizeofstruct sockaddr == -1 { perrorsendto;
exit1; }
printfsent d bytes to s\n, numbytes, inet_ntoatheir_addr.sin_addr;
closesockfd; return 0;
}
8.2.4.
Socket lanjutan
Pada bagian ini dijelaskan tentang penggunaan beberapa fungsi yang dapat mendukung kerja dari program jaringan menggunakan pemrograman socket.
8.2.4.1. Blocking