Presentation is loading. Please wait.

Presentation is loading. Please wait.

CSTP FS97CS490D (cotter)1 Sockets Programming in UNIX References: Internetworking with TCP/IP Vol III - BSD version UNIX Network Programming - W. Richard.

Similar presentations


Presentation on theme: "CSTP FS97CS490D (cotter)1 Sockets Programming in UNIX References: Internetworking with TCP/IP Vol III - BSD version UNIX Network Programming - W. Richard."— Presentation transcript:

1 CSTP FS97CS490D (cotter)1 Sockets Programming in UNIX References: Internetworking with TCP/IP Vol III - BSD version UNIX Network Programming - W. Richard Stevens

2 CSTP WS01CS423 (cotter)2 Sockets Programming in UNIX UNIX Socket API functions Example TCP / UDP Clients Example TCP / UDP Servers

3 CSTP WS01CS423 (cotter)3 Basic Socket Functions Server(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 CSTP WS01CS423 (cotter)4 Basic Socket Functions Server(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 CSTP WS01CS423 (cotter)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 CSTP WS01CS423 (cotter)6 Basic Socket Functions Client (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 CSTP WS01CS423 (cotter)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->h_addr, (caddr_T)&svaddr.sin_addr, hp->h_length)

8 CSTP WS01CS423 (cotter)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 CSTP WS01CS423 (cotter)9 Example UNIX Client connectTCP.c intconnectTCP (char *host, char *service) { return connectsock (host, service, “tcp”); }

10 CSTP WS01CS423 (cotter)10 Example UNIX Client connectsock.c #include,,, 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 CSTP WS01CS423 (cotter)11 Example UNIX Client connectsock.c bzero ((char *)&sin, sizeof (sin)); sin.sin_family = AF_INET; if (pse = getservbyname (service, protocol) ) sin.sin_port = pse ->s_port; else if ( (sin.sin_port = htons((u_short)atoi(service))) == 0) error_exit (“can’t get %s service\n”, service); if (phe = gethostbyname (host) ) bcopy(phe->h_addr, (char *)&sin.sin_addr, phe->h_length); else if ((sin.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE ) error_exit (“can’t get %s host\n”, host);

12 CSTP WS01CS423 (cotter)12 Example UNIX Client connectsock.c if ( (ppe = getprotobyname (protocol) == 0) error_exit (“can’t get %s host\n”, host); if (strcmp (protocol, “tcp”) == 0) type = SOCK_STREAM; else type = SOCK_DGRAM; if (s = socket (PF_INET, type, ppe->p_proto)) < 0) error_exit (“Can’t create a socket\n”); if (connect (s, (struct sockaddr *)&sin, sizeof(sin)) < 0) error_exit (“can’t connect to remote socket\n”); return s; }

13 CSTP WS01CS423 (cotter)13 Example UNIX Client TCPecho.c #include #define LINELEN128 int main (argc, argv) { host = argv[1]; service = argv[2]; TCPecho (host, service); exit (0); }

14 CSTP WS01CS423 (cotter)14 Example UNIX Client TCPecho.c int TCPecho (char *host, char *service) { charbuf[LINELEN+1]; ints, n, outchars, inchars; s = connectTCP (host, service); while (fgets (buf, sizeof(buf), stdin)) { buf[LINELEN] = ‘\0’; outchars = strlen(buf); (void) write (s, buf, outchars);

15 CSTP WS01CS423 (cotter)15 Example UNIX Client TCPecho.c for (inchars = 0; inchars < outchars; inchars +=n) { n = read (s, &buf[inchars], outchars - inchars); if (n < 0) error_exit(“socket read failed\n”); } fputs (buf, stdout); }

16 CSTP WS01CS423 (cotter)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 CSTP WS01CS423 (cotter)17 Example UNIX Client UDPecho.c #include #define LINELEN128 int main (argc, argv) { host = argv[1]; service = argv[2]; UDPecho (host, service); exit (0); }

18 CSTP WS01CS423 (cotter)18 Example UNIX Client UDPecho.c int UDPecho (char *host, char *service) { charbuf[LINELEN+1]; ints, n, outchars, inchars; s = connectUDP (host, service); while (fgets (buf, sizeof(buf), stdin)) { buf[LINELEN] = ‘\0’; outchars = strlen(buf); (void) write (s, buf, outchars);

19 CSTP WS01CS423 (cotter)19 Example UNIX Client UDPecho.c if (read (s, buf, nchars) < 0) error_exit (“Socket read failed \n”); fputs (buf, stdout); }

20 CSTP WS01CS423 (cotter)20 Iterative Connectionless Servers TIME Server /* UDPtimed.c - main */ #include extern interrno; intpassiveUDP(const char *service); interrexit(const char *format,...); #define UNIXEPOCH2208988800 /* UNIX epoch, in UCT secs*/

21 CSTP WS01CS423 (cotter)21 Iterative Connectionless Servers TIME 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 */ charbuf[1];/* "input" buffer; any size > 0 */ intsock;/* server socket*/ time_tnow;/* current time*/ intalen;/* from-address length*/ switch (argc) { case1:break; case2:service = argv[1]; break; default:errexit("usage: UDPtimed [port]\n"); }

22 CSTP WS01CS423 (cotter)22 Iterative Connectionless Servers TIME Server sock = passiveUDP(service); while (1) { alen = sizeof(fsin); if (recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&fsin, &alen) < 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 CSTP WS01CS423 (cotter)23 Concurrent Connection-Oriented TCPechod.c #include,,,,,,,,,,, #define QLEN 5/* maximum connection queue length */ #defineBUFSIZE4096 extern interrno; voidreaper(int); intTCPechod(int fd); interrexit(const char *format,...); intpassiveTCP(const char *service, int qlen);

24 CSTP WS01CS423 (cotter)24 Concurrent Connection-Oriented TCPechod.c int main(int argc, char *argv[ ]) { char*service = "echo";/* service name or port number*/ struct sockaddr_in fsin;/* the address of a client*/ intalen;/* length of client's address*/ intmsock;/* master server socket*/ intssock;/* slave server socket*/ switch (argc) { case1:break; case2:service = argv[1]; break; default:errexit("usage: TCPechod [port]\n"); }

25 CSTP WS01CS423 (cotter)25 Concurrent Connection-Oriented TCPechod.c msock = passiveTCP(service, QLEN); (void) signal(SIGCHLD, reaper); while (1) { alen = sizeof(fsin); ssock = accept(msock, (struct sockaddr *)&fsin, &alen); if (ssock < 0) { if (errno == EINTR) continue; errexit("accept: %s\n", strerror(errno)); }

26 CSTP WS01CS423 (cotter)26 Concurrent Connection-Oriented TCPechod.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 CSTP WS01CS423 (cotter)27 Concurrent Connection-Oriented TCPechod.c intTCPechod(int fd) { charbuf[BUFSIZ]; intcc; while (cc = read(fd, buf, sizeof buf)) { if (cc < 0) errexit("echo read: %s\n", strerror(errno)); if (write(fd, buf, cc) < 0) errexit("echo write: %s\n", strerror(errno)); } return 0; }

28 CSTP WS01CS423 (cotter)28 Concurrent Connection-Oriented TCPechod.c /*--------------------------------------------------- * reaper - clean up zombie children *--------------------------------------------------*/ /*ARGSUSED*/ void reaper(int sig) { intstatus; while (wait3(&status, WNOHANG, (struct rusage *)0) >= 0) /* empty */; }


Download ppt "CSTP FS97CS490D (cotter)1 Sockets Programming in UNIX References: Internetworking with TCP/IP Vol III - BSD version UNIX Network Programming - W. Richard."

Similar presentations


Ads by Google