Sockets Programming in UNIX - PowerPoint PPT Presentation

1 / 28
About This Presentation
Title:

Sockets Programming in UNIX

Description:

Sockets Programming in UNIX References: Internetworking with TCP/IP Vol III - BSD version UNIX Network Programming - W. Richard Stevens Sockets Programming in UNIX ... – PowerPoint PPT presentation

Number of Views:102
Avg rating:3.0/5.0
Slides: 29
Provided by: BobCo64
Category:

less

Transcript and Presenter's Notes

Title: Sockets Programming in UNIX


1
Sockets Programming in UNIX
  • References
  • Internetworking with TCP/IP Vol III - BSD version
  • UNIX Network Programming - W. Richard Stevens

2
Sockets Programming in UNIX
  • UNIX Socket API functions
  • Example TCP / UDP Clients
  • Example TCP / UDP Servers

3
Basic Socket FunctionsServer(UNIX)
  • Create a socket of a particular type
  • retcode socket (family, type, protocol )
  • s socket (PF_INET, SOCK_STREAM, 0)
  • returns socket number or -1 on error
  • Bind that socket to a specific port
  • retcode bind (socket, localaddr, addrlen )
  • n bind (s, (struct sockaddr )myaddr,
    sizeof(myaddr))
  • returns 0 on success, -1 on fail

4
Basic Socket FunctionsServer(UNIX)
  • Wait for an incoming message
  • retcode listen (socket, queuelen)
  • ans listen(s, 0) / queuelen max 5/
  • return value 0 success, -1 fail
  • Create a new socket and return new socket ID to
    client
  • retcode accept (socket, addr, addrlen)
  • ans accept (s, (struct sockaddr )cl_addr,
    sizeof(cl_addr))
  • return value socket number success, -1 fail

5
Basic Socket Functions Server (UNIX)
  • Read / send a message
  • retcode read write (socket, buff, bufflen)
  • ans read (s, buf, sizeof(buf))
  • ans write (s, buf, sizeof(buf))
  • return value word count success, -1 fail
  • Close the socket
  • retcode shutdown (socket , direction)
  • direction 0 means input, 1 means output, 2 means
    both
  • retcode close (socket )
  • return value 0 success, -1 fail

6
Basic Socket FunctionsClient (UNIX)
  • Create a socket of a particular type
  • Socket ( )
  • Establish a connection to a remote Port/Socket
  • retcode connect (socket, addr, addrlen)
  • ans connect (s, (struct sockaddr )svr,
    sizeof(svr))
  • return value 0 success, -1 fail
  • Send and receive messages to/from remote socket
  • Read ( ) / Write ( )
  • Close the socket
  • Close ( )

7
Additional Socket Functions(UNIX)
  • Byte ordering functions
  • servaddr.sin_port htons (SERV_PORT)
  • myaddr.sin_addr.s_addr htonl (INADDR_ANY)
  • Name resolution functions
  • host / protocol / service, by name / address /
    port
  • Other Stuff
  • zero out memory blocks
  • bzero ((char )myaddr, sizeof(myaddr))
  • copy memory blocks
  • bcopy (hp-gth_addr, (caddr_T)svaddr.sin_addr,
    hp-gth_length)

8
Example UNIX Client
  • Develop a set of procedures that can be used by
    other programs to implement client / server.
  • int connectTCP (host, service)
  • int connectsock(host, service, tcp)
  • identify service, host, port
  • get a socket
  • connect to service / host / port
  • return socket number

9
Example UNIX ClientconnectTCP.c
  • int connectTCP (char host, char service)
  • return connectsock (host, service, tcp)

10
Example UNIX Clientconnectsock.c
  • include ltsys/types.hgt, ltsys/socket.hgt,
    ltnetinet/in.hgt,ltnetdb.hgt
  • int connectsock (char host, char service, char
    protocol)
  • struct hostent phe
  • struct servent pse
  • struct protoent ppe
  • struct sockaddr_in sin
  • int s, type

11
Example UNIX Clientconnectsock.c
  • bzero ((char )sin, sizeof (sin))
  • sin.sin_family AF_INET
  • if (pse getservbyname (service, protocol) )
  • sin.sin_port pse -gts_port
  • else if ( (sin.sin_port htons((u_short)atoi(serv
    ice))) 0)
  • error_exit (cant get s service\n, service)
  • if (phe gethostbyname (host) )
  • bcopy(phe-gth_addr, (char )sin.sin_addr,
    phe-gth_length)
  • else if ((sin.sin_addr.s_addr inet_addr(host))
    INADDR_NONE)
  • error_exit (cant get s host\n, host)

12
Example UNIX Clientconnectsock.c
  • if ( (ppe getprotobyname (protocol) 0)
  • error_exit (cant get s host\n, host)
  • if (strcmp (protocol, tcp) 0)
  • type SOCK_STREAM
  • else type SOCK_DGRAM
  • if (s socket (PF_INET, type, ppe-gtp_proto)) lt
    0)
  • error_exit (Cant create a socket\n)
  • if (connect (s, (struct sockaddr )sin,
    sizeof(sin)) lt 0)
  • error_exit (cant connect to remote socket\n)
  • return s

13
Example UNIX ClientTCPecho.c
  • include ltstdio.hgt
  • define LINELEN 128
  • int main (argc, argv)
  • host argv1
  • service argv2
  • TCPecho (host, service)
  • exit (0)

14
Example UNIX ClientTCPecho.c
  • int TCPecho (char host, char service)
  • char bufLINELEN1
  • int s, n, outchars, inchars
  • s connectTCP (host, service)
  • while (fgets (buf, sizeof(buf), stdin))
  • bufLINELEN \0
  • outchars strlen(buf)
  • (void) write (s, buf, outchars)

15
Example UNIX ClientTCPecho.c
  • for (inchars 0 inchars lt outchars inchars
    n)
  • n read (s, bufinchars, outchars -
    inchars)
  • if (n lt 0)
  • error_exit(socket read failed\n)
  • fputs (buf, stdout)

16
TCP Client Algorithm
  • Client / Server Communications
  • request / response interaction
  • write / read (send / recv)
  • Single write may require multiple reads
  • response may be segmented
  • continue appending reads until return length 0

17
Example UNIX ClientUDPecho.c
  • include ltstdio.hgt
  • define LINELEN 128
  • int main (argc, argv)
  • host argv1
  • service argv2
  • UDPecho (host, service)
  • exit (0)

18
Example UNIX ClientUDPecho.c
  • int UDPecho (char host, char service)
  • char bufLINELEN1
  • int s, n, outchars, inchars
  • s connectUDP (host, service)
  • while (fgets (buf, sizeof(buf), stdin))
  • bufLINELEN \0
  • outchars strlen(buf)
  • (void) write (s, buf, outchars)

19
Example UNIX ClientUDPecho.c
  • if (read (s, buf, nchars) lt 0)
  • error_exit (Socket read failed \n)
  • fputs (buf, stdout)

20
Iterative Connectionless ServersTIME Server
  • / UDPtimed.c - main /
  • include ltsys/types.hgt
  • include ltsys/socket.hgt
  • include ltnetinet/in.hgt
  • include ltstdio.hgt
  • include lttime.hgt
  • include ltstring.hgt
  • extern int errno
  • int passiveUDP(const char service)
  • int errexit(const char format, ...)
  • define UNIXEPOCH 2208988800 / UNIX epoch, in
    UCT secs/

21
Iterative Connectionless ServersTIME Server
  • int main(int argc, char argv)
  • struct sockaddr_in fsin / the from address of
    a client /
  • char service "time" / service name or port
    number /
  • char buf1 / "input" buffer any size gt 0 /
  • int sock / server socket /
  • time_t now / current time /
  • int alen / from-address length /
  • switch (argc)
  • case 1 break
  • case 2 service argv1
  • break
  • default errexit("usage UDPtimed port\n")

22
Iterative Connectionless ServersTIME Server
  • sock passiveUDP(service)
  • while (1)
  • alen sizeof(fsin)
  • if (recvfrom(sock, buf, sizeof(buf), 0,
  • (struct sockaddr )fsin, alen) lt 0)
  • errexit("recvfrom s\n", strerror(errno))
  • (void) time(now)
  • now htonl((u_long)(now UNIXEPOCH))
  • (void) sendto(sock, (char )now, sizeof(now),
    0,
  • (struct sockaddr )fsin, sizeof(fsin))

23
Concurrent Connection-OrientedTCPechod.c
  • include ltsys/types.hgt,ltsys/signal.hgt,ltsys/socket.
    hgt, ltsys/time.hgt,ltsys/wait.hgt,ltsys/resource.hgt,ltsy
    s/errno.hgt, ltnetinet/in.hgt,ltunistd.hgt,ltstdlib.hgt,lt
    stdio.hgt,ltstring.hgt
  • define QLEN 5 / maximum connection queue
    length /
  • define BUFSIZE 4096
  • extern int errno
  • void reaper(int)
  • int TCPechod(int fd)
  • int errexit(const char format, ...)
  • int passiveTCP(const char service, int qlen)

24
Concurrent Connection-OrientedTCPechod.c
  • int main(int argc, char argv )
  • char service "echo" / service name or port
    number/
  • struct sockaddr_in fsin / the address of a
    client /
  • int alen / length of client's address/
  • int msock / master server socket /
  • int ssock / slave server socket /
  • switch (argc)
  • case 1 break
  • case 2 service argv1
  • break
  • default errexit("usage TCPechod port\n")

25
Concurrent Connection-OrientedTCPechod.c
  • msock passiveTCP(service, QLEN)
  • (void) signal(SIGCHLD, reaper)
  • while (1)
  • alen sizeof(fsin)
  • ssock accept(msock, (struct sockaddr )fsin,
    alen)
  • if (ssock lt 0)
  • if (errno EINTR)
  • continue
  • errexit("accept s\n", strerror(errno))

26
Concurrent Connection-OrientedTCPechod.c
  • switch (fork())
  • case 0 / child /
  • (void) close(msock)
  • exit(TCPechod(ssock))
  • default / parent /
  • (void) close(ssock)
  • break
  • case -1
  • errexit("fork s\n", strerror(errno))

27
Concurrent Connection-OrientedTCPechod.c
  • int TCPechod(int fd)
  • char bufBUFSIZ
  • int cc
  • while (cc read(fd, buf, sizeof buf))
  • if (cc lt 0)
  • errexit("echo read s\n", strerror(errno))
  • if (write(fd, buf, cc) lt 0)
  • errexit("echo write s\n", strerror(errno))
  • return 0

28
Concurrent Connection-OrientedTCPechod.c
  • /------------------------------------------------
    ---
  • reaper - clean up zombie children
  • ------------------------------------------------
    --/
  • /ARGSUSED/
  • void
  • reaper(int sig)
  • int status
  • while (wait3(status, WNOHANG, (struct rusage
    )0) gt 0)
  • / empty /
Write a Comment
User Comments (0)
About PowerShow.com