Removed bogus directory

buffered-read-3-0-BETA
Stephane Bortzmeyer 24 years ago
parent 936a7bf78f
commit aab38992d2

@ -1,71 +0,0 @@
# Change the following as required:
CC = gcc
CFLAGS = -Wall
#CFLAGS = -ansi -Wall -Dsun -D__STDC__=0 -DMSG_EOF=0
# My flags for gcc/solaris 2.3: -ansi -Wall -Dsun -D__STDC__=0
# (Solaris -DMSG_EOF just to let me compile it under Solaris; it won't run)
# Add in -DGCC_STRUCT_PROBLEM for gcc versions 1.x under SunOS 4.x
# Add in -D__STDC__=0 for gcc under Solaris 2 (for Sun's screwy headers)
# Add in -D_BSD=44 for AIX 3.2.2 (see <sys/socket.h>)
# Add in -D_SOCKADDR_LEN for DEC OSF/1 (see <sys/socket.h>)
# Following line for SVR4, Solaris 2.x; 2.5 no longer requires libucb.a.
#LIBS = ./libmisc.a /usr/ucblib/libucb.a -lsocket -lnsl
# Following line for 4.4BSD, BSD/386, SunOS 4.x, AIX 3.2.2, OSF/1
LIBS = ./libmisc.a
PROGS = udpcli udpserv tcpcli tcpserv ttcpcli ttcpserv \
ttcpclibig ttcpservbig ttcphttpcli \
udpclitime udpservtime tcpclitime tcpservtime ttcpclitime ttcpservtime
all: ${PROGS}
udpcli: udpcli.o
${CC} ${CCFLAGS} -o $@ udpcli.o ${LIBS}
udpserv: udpserv.o
${CC} ${CCFLAGS} -o $@ udpserv.o ${LIBS}
tcpcli: tcpcli.o readstream.o
${CC} ${CCFLAGS} -o $@ tcpcli.o readstream.o ${LIBS}
tcpserv: tcpserv.o readstream.o
${CC} ${CCFLAGS} -o $@ tcpserv.o readstream.o ${LIBS}
ttcpcli: ttcpcli.o readstream.o
${CC} ${CCFLAGS} -o $@ ttcpcli.o readstream.o ${LIBS}
ttcpserv: ttcpserv.o readstream.o
${CC} ${CCFLAGS} -o $@ ttcpserv.o readstream.o ${LIBS}
ttcpclibig: ttcpclibig.o readstream.o
${CC} ${CCFLAGS} -o $@ ttcpclibig.o readstream.o ${LIBS}
ttcpservbig: ttcpservbig.o readstream.o
${CC} ${CCFLAGS} -o $@ ttcpservbig.o readstream.o ${LIBS}
ttcphttpcli: ttcphttpcli.o readstream.o
${CC} ${CCFLAGS} -o $@ ttcphttpcli.o readstream.o ${LIBS}
udpclitime: udpclitime.o timer.o
${CC} ${CCFLAGS} -o $@ udpclitime.o timer.o ${LIBS}
udpservtime: udpservtime.o timer.o
${CC} ${CCFLAGS} -o $@ udpservtime.o timer.o ${LIBS}
tcpclitime: tcpclitime.o readstream.o timer.o
${CC} ${CCFLAGS} -o $@ tcpclitime.o readstream.o timer.o ${LIBS}
tcpservtime: tcpservtime.o readstream.o timer.o
${CC} ${CCFLAGS} -o $@ tcpservtime.o readstream.o timer.o ${LIBS}
ttcpclitime: ttcpclitime.o readstream.o timer.o
${CC} ${CCFLAGS} -o $@ ttcpclitime.o readstream.o timer.o ${LIBS}
ttcpservtime: ttcpservtime.o readstream.o timer.o
${CC} ${CCFLAGS} -o $@ ttcpservtime.o readstream.o timer.o ${LIBS}
clean:
rm -f ${PROGS} core core.* *.o temp.* *.out typescript*

@ -1,26 +0,0 @@
The files in this archive are the example programs from Chapter 1 of
"TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP, and
the UNIX Domain Protocols" by W. Richard Stevens (Addison-Wesley, 1996).
All the source code files assume tabs stop every 4 columns, not 8. With
vi I use ":set tabstop=4".
The files with "time" in their name are versions that can be used to time
the client-server transactions (used for Figure 1.14 of the text). The
three server programs with "time" in their name also allow a command-line
option specifying how long they should sleep, to simulate the server
processing time. Also notice that these "time" clients have a doubly
nested loop: one for the request-reply size and another for the number
of iterations.
The two T/TCP files with "big" in their name define the request and reply
size to exceed one MSS (used for the example in Section 3.6 of the text).
*Before* trying to make these programs, do something like
cc -c error.c sleepus.c
ar -crv libmisc.a error.o sleepus.o
ranlib libmisc.a # needed for a BSD-derived system
Then change the definitions of CC, CFLAGS, and LIBS in the Makefile,
as appropriate for your system. Then you can "make all".

@ -1,32 +0,0 @@
/* Common includes and defines for UDP, TCP, and T/TCP
* clients and servers */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define REQUEST 400 /* max size of request, in bytes */
#define REPLY 400 /* max size of reply, in bytes */
#define UDP_SERV_PORT 7777 /* UDP server's well-known port */
#define TCP_SERV_PORT 8888 /* TCP server's well-known port */
#define TTCP_SERV_PORT 9999 /* T/TCP server's well-known port */
/* Following shortens all the type casts of pointer arguments */
#define SA struct sockaddr *
void err_quit(const char *, ...);
void err_sys(const char *, ...);
int read_stream(int, char *, int);
/* following for timing versions of client-server */
void start_timer(void);
double print_timer(void);
void sleep_us(unsigned int);
#define min(a,b) ((a) < (b) ? (a) : (b))

@ -1,110 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include <errno.h> /* for definition of errno */
#include <stdarg.h> /* ANSI C header file */
#include <stdio.h> /* ANSI C header file */
#include <stdlib.h> /* ANSI C header file */
#include <string.h> /* ANSI C header file */
#include <unistd.h> /* ANSI C header file */
#define MAXLINE 4096
static void err_doit(int, const char *, va_list);
/* Nonfatal error related to a system call.
* Print a message and return. */
void
err_ret(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(1, fmt, ap);
va_end(ap);
return;
}
/* Fatal error related to a system call.
* Print a message and terminate. */
void
err_sys(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(1, fmt, ap);
va_end(ap);
exit(1);
}
/* Fatal error related to a system call.
* Print a message, dump core, and terminate. */
void
err_dump(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(1, fmt, ap);
va_end(ap);
abort(); /* dump core and terminate */
exit(1); /* shouldn't get here */
}
/* Nonfatal error unrelated to a system call.
* Print a message and return. */
void
err_msg(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(0, fmt, ap);
va_end(ap);
return;
}
/* Fatal error unrelated to a system call.
* Print a message and terminate. */
void
err_quit(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(0, fmt, ap);
va_end(ap);
exit(1);
}
/* Print a message and return to caller.
* Caller specifies "errnoflag". */
static void
err_doit(int errnoflag, const char *fmt, va_list ap)
{
int errno_save;
char buf[MAXLINE];
errno_save = errno; /* value caller might want printed */
vsprintf(buf, fmt, ap);
if (errnoflag)
sprintf(buf+strlen(buf), ": %s", strerror(errno_save));
strcat(buf, "\n");
fflush(stdout); /* in case stdout and stderr are the same */
fputs(buf, stderr);
fflush(stderr); /* SunOS 4.1.* doesn't grok NULL argument */
return;
}

@ -1,27 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
int
read_stream(int fd, char *ptr, int maxbytes)
{
int nleft, nread;
nleft = maxbytes;
while (nleft > 0) {
if ( (nread = read(fd, ptr, nleft)) < 0)
return(nread); /* error, return < 0 */
else if (nread == 0)
break; /* EOF, return #bytes read */
nleft -= nread;
ptr += nread;
}
return(maxbytes - nleft); /* return >= 0 */
}

@ -1,37 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include <sys/types.h>
#include <sys/time.h>
#include <errno.h>
#include <stddef.h>
void
sleep_us(unsigned int nusecs)
{
struct timeval tval;
for ( ; ; ) {
tval.tv_sec = nusecs / 1000000;
tval.tv_usec = nusecs % 1000000;
if (select(0, NULL, NULL, NULL, &tval) == 0)
break; /* all OK */
/*
* Note than on an interrupted system call (i.e, SIGIO) there's not
* much we can do, since the timeval{} isn't updated with the time
* remaining. We could obtain the clock time before the call, and
* then obtain the clock time here, subtracting them to determine
* how long select() blocked before it was interrupted, but that
* seems like too much work :-)
*/
if (errno == EINTR)
continue;
err_sys("sleep_us: select error");
}
}

@ -1,46 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
int
main(int argc, char *argv[]) /* simple TCP client */
{
struct sockaddr_in serv;
char request[REQUEST], reply[REPLY];
int sockfd, n;
if (argc != 2)
err_quit("usage: tcpcli <IP address of server>");
if ( (sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
memset(&serv, 0, sizeof(serv));
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = inet_addr(argv[1]);
serv.sin_port = htons(TCP_SERV_PORT);
if (connect(sockfd, (SA) &serv, sizeof(serv)) < 0)
err_sys("connect error");
/* form request[] ... */
if (write(sockfd, request, REQUEST) != REQUEST)
err_sys("write error");
if (shutdown(sockfd, 1) < 0)
err_sys("shutdown error");
if ( (n = read_stream(sockfd, reply, REPLY)) < 0)
err_sys("read error");
/* process "n" bytes of reply[] ... */
exit(0);
}

@ -1,59 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
int
main(int argc, char *argv[])
{
struct sockaddr_in serv;
char request[5000], reply[5000];
int sockfd, n, len, i;
double rtt, minrtt;
if (argc != 2)
err_quit("usage: tcpcli <IP address of server>");
memset(&serv, sizeof(serv), 0);
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = inet_addr(argv[1]);
serv.sin_port = htons(TCP_SERV_PORT);
for (len = 0; len <= 1400; len += 100) {
printf("len = %d\n", len);
minrtt = 9999999;
for (i = 0; i < 30; i++) {
if ( (sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
start_timer();
if (connect(sockfd, (SA) &serv, sizeof(serv)) < 0)
err_sys("connect error");
/* form request[] ... */
if (write(sockfd, request, len) != len)
err_sys("write error");
if (shutdown(sockfd, 1) < 0)
err_sys("shutdown error");
if ( (n = read_stream(sockfd, reply, len)) != len)
err_sys("read error, n = %d", n);
rtt = print_timer();
minrtt = min(minrtt, rtt);
/* process "n" bytes of reply[] ... */
close(sockfd);
}
printf("min rtt = %9.3f\n\n", minrtt);
}
exit(0);
}

@ -1,48 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
int
main() /* simple TCP server */
{
struct sockaddr_in serv, cli;
char request[REQUEST], reply[REPLY];
int listenfd, sockfd, n, clilen;
if ( (listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
memset(&serv, 0, sizeof(serv));
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = htonl(INADDR_ANY);
serv.sin_port = htons(TCP_SERV_PORT);
if (bind(listenfd, (SA) &serv, sizeof(serv)) < 0)
err_sys("bind error");
if (listen(listenfd, SOMAXCONN) < 0)
err_sys("listen error");
for ( ; ; ) {
clilen = sizeof(cli);
if ( (sockfd = accept(listenfd, (SA) &cli, &clilen)) < 0)
err_sys("accept error");
if ( (n = read_stream(sockfd, request, REQUEST)) < 0)
err_sys("read error");
/* process "n" bytes of request[] and create reply[] ... */
if (write(sockfd, reply, REPLY) != REPLY)
err_sys("write error");
close(sockfd);
}
}

@ -1,55 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
int
main(int argc, char *argv[])
{
struct sockaddr_in serv, cli;
char request[5000], reply[5000];
int listenfd, sockfd, n, clilen, spt;
if (argc > 1)
spt = atoi(argv[1]); /* optional server processing time, in ms */
else
spt = 0;
if ( (listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
memset(&serv, sizeof(serv), 0);
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = htonl(INADDR_ANY);
serv.sin_port = htons(TCP_SERV_PORT);
if (bind(listenfd, (SA) &serv, sizeof(serv)) < 0)
err_sys("bind error");
if (listen(listenfd, SOMAXCONN) < 0)
err_sys("listen error");
for ( ; ; ) {
clilen = sizeof(cli);
if ( (sockfd = accept(listenfd, (SA) &cli, &clilen)) < 0)
err_sys("accept error");
if ( (n = read_stream(sockfd, request, sizeof(request))) < 0)
err_sys("read error");
/* process "n" bytes of request[] ... */
if (spt)
sleep_us(spt * 1000);
if (write(sockfd, reply, n) != n)
err_sys("write error");
close(sockfd);
}
}

@ -1,49 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
#include <sys/time.h>
void tvsub(struct timeval *, struct timeval *);
struct timeval tvstart, tvend;
void
start_timer()
{
if (gettimeofday(&tvstart, NULL) < 0)
err_sys("start_timer: gettimeofday error");
}
double
print_timer()
{
double triptime;
if (gettimeofday(&tvend, NULL) < 0)
err_sys("print_timer: gettimeofday error");
tvsub(&tvend, &tvstart);
triptime = ((double) tvend.tv_sec) * 1000.0 +
((double) tvend.tv_usec) / 1000.0; /* in millisec */
printf("rtt = %9.3f ms\n", triptime);
return(triptime);
}
/* Subtract two timeval structures: *end -= *start */
void
tvsub(struct timeval *end, struct timeval *start)
{
if ((end->tv_usec -= start->tv_usec) < 0) {
--end->tv_sec;
end->tv_usec += 1000000;
}
end->tv_sec -= start->tv_sec;
}

@ -1,42 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
int
main(int argc, char *argv[]) /* T/TCP client */
{
struct sockaddr_in serv;
char request[REQUEST], reply[REPLY];
int sockfd, n;
if (argc != 2)
err_quit("usage: ttcpcli <IP address of server>");
if ( (sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
memset(&serv, 0, sizeof(serv));
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = inet_addr(argv[1]);
serv.sin_port = htons(TCP_SERV_PORT);
/* form request[] ... */
if (sendto(sockfd, request, REQUEST, MSG_EOF,
(SA) &serv, sizeof(serv)) != REQUEST)
err_sys("sendto error");
if ( (n = read_stream(sockfd, reply, REPLY)) < 0)
err_sys("read error");
/* process "n" bytes of reply[] ... */
exit(0);
}

@ -1,61 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
#include <netinet/tcp.h>
#undef REQUEST
#undef REPLY
#define REQUEST 3300 /* max size of request, in bytes */
#define REPLY 3400 /* max size of reply, in bytes */
int
main(int argc, char *argv[])
{
struct sockaddr_in serv;
char request[REQUEST], reply[REPLY];
int sockfd, n;
if (argc != 2)
err_quit("usage: ttcpcli <IP address of server>");
if ( (sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
n = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_DEBUG,
(char *) &n, sizeof(n)) < 0)
err_sys("SO_DEBUG error");
#ifdef notdef
n = 1;
if (setsockopt(sockfd, IPPROTO_TCP, TCP_NOPUSH,
(char *) &n, sizeof(n)) < 0)
err_sys("TCP_NOPUSH error");
#endif
memset(&serv, sizeof(serv), 0);
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = inet_addr(argv[1]);
serv.sin_port = htons(TCP_SERV_PORT);
/* form request[] ... */
if (sendto(sockfd, request, REQUEST, MSG_EOF,
(SA) &serv, sizeof(serv)) != REQUEST)
err_sys("sendto error");
if ( (n = read_stream(sockfd, reply, REPLY)) < 0)
err_sys("read error");
/* process "n" bytes of reply[] ... */
exit(0);
}

@ -1,54 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
int
main(int argc, char *argv[])
{
struct sockaddr_in serv;
char request[5000], reply[5000];
int sockfd, n, len, i;
double rtt, minrtt;
if (argc != 2)
err_quit("usage: ttcpcli <IP address of server>");
memset(&serv, sizeof(serv), 0);
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = inet_addr(argv[1]);
serv.sin_port = htons(TTCP_SERV_PORT);
for (len = 0; len <= 1400; len += 100) {
printf("len = %d\n", len);
minrtt = 9999999;
for (i = 0; i < 30; i++) {
if ( (sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
/* form request[] ... */
start_timer();
if (sendto(sockfd, request, len, MSG_EOF,
(SA) &serv, sizeof(serv)) != len)
err_sys("sendto error");
if ( (n = read_stream(sockfd, reply, len)) < 0)
err_sys("read error");
rtt = print_timer();
minrtt = min(minrtt, rtt);
/* process "n" bytes of reply[] ... */
close(sockfd);
}
printf("min rtt = %9.3f\n\n", minrtt);
}
exit(0);
}

@ -1,45 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
int
main(int argc, char *argv[]) /* T/TCP client */
{
struct sockaddr_in serv;
char reply[REPLY];
static char request[] = "GET / HTTP/1.0\n\r\n\r";
int sockfd, n;
if (argc != 2)
err_quit("usage: ttcpcli <IP address of server>");
if ( (sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
memset(&serv, sizeof(serv), 0);
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = inet_addr(argv[1]);
serv.sin_port = htons(80);
/* form request[] ... */
if (sendto(sockfd, request, sizeof(request)-1, MSG_EOF,
(SA) &serv, sizeof(serv)) != sizeof(request)-1)
err_sys("sendto error");
while ( (n = read_stream(sockfd, reply, REPLY)) > 0) {
/* process "n" bytes of reply[] ... */
write(1, reply, n);
}
if (n < 0)
err_sys("read error");
exit(0);
}

@ -1,48 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
int
main() /* T/TCP server */
{
struct sockaddr_in serv, cli;
char request[REQUEST], reply[REPLY];
int listenfd, sockfd, n, clilen;
if ( (listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
memset(&serv, 0, sizeof(serv));
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = htonl(INADDR_ANY);
serv.sin_port = htons(TCP_SERV_PORT);
if (bind(listenfd, (SA) &serv, sizeof(serv)) < 0)
err_sys("bind error");
if (listen(listenfd, SOMAXCONN) < 0)
err_sys("listen error");
for ( ; ; ) {
clilen = sizeof(cli);
if ( (sockfd = accept(listenfd, (SA) &cli, &clilen)) < 0)
err_sys("accept error");
if ( (n = read_stream(sockfd, request, REQUEST)) < 0)
err_sys("read error");
/* process "n" bytes of request[] and create reply[] ... */
if (send(sockfd, reply, REPLY, MSG_EOF) != REPLY)
err_sys("send error");
close(sockfd);
}
}

@ -1,54 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
#undef REQUEST
#undef REPLY
#define REQUEST 3300 /* max size of request, in bytes */
#define REPLY 3400 /* max size of reply, in bytes */
int
main()
{
struct sockaddr_in serv, cli;
char request[REQUEST], reply[REPLY];
int listenfd, sockfd, n, clilen;
if ( (listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
memset(&serv, sizeof(serv), 0);
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = htonl(INADDR_ANY);
serv.sin_port = htons(TCP_SERV_PORT);
if (bind(listenfd, (SA) &serv, sizeof(serv)) < 0)
err_sys("bind error");
if (listen(listenfd, SOMAXCONN) < 0)
err_sys("listen error");
for ( ; ; ) {
clilen = sizeof(cli);
if ( (sockfd = accept(listenfd, (SA) &cli, &clilen)) < 0)
err_sys("accept error");
if ( (n = read_stream(sockfd, request, REQUEST)) < 0)
err_sys("read error");
/* process "n" bytes of request[] ... */
if (sendto(sockfd, reply, REPLY, MSG_EOF, (SA) NULL, 0) != REPLY)
err_sys("sendto error");
close(sockfd);
}
}

@ -1,55 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
int
main(int argc, char *argv[])
{
struct sockaddr_in serv, cli;
char request[5000], reply[5000];
int listenfd, sockfd, n, clilen, spt;
if (argc > 1)
spt = atoi(argv[1]); /* optional server processing time, in ms */
else
spt = 0;
if ( (listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
memset(&serv, sizeof(serv), 0);
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = htonl(INADDR_ANY);
serv.sin_port = htons(TTCP_SERV_PORT);
if (bind(listenfd, (SA) &serv, sizeof(serv)) < 0)
err_sys("bind error");
if (listen(listenfd, SOMAXCONN) < 0)
err_sys("listen error");
for ( ; ; ) {
clilen = sizeof(cli);
if ( (sockfd = accept(listenfd, (SA) &cli, &clilen)) < 0)
err_sys("accept error");
if ( (n = read_stream(sockfd, request, sizeof(request))) < 0)
err_sys("read error");
/* process "n" bytes of request[] ... */
if (spt)
sleep_us(spt * 1000);
if (sendto(sockfd, reply, n, MSG_EOF, (SA) NULL, 0) != n)
err_sys("sendto error");
close(sockfd);
}
}

@ -1,43 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
int
main(int argc, char *argv[]) /* simple UDP client */
{
struct sockaddr_in serv;
char request[REQUEST], reply[REPLY];
int sockfd, n;
if (argc != 2)
err_quit("usage: udpcli <IP address of server>");
if ( (sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
err_sys("socket error");
memset(&serv, 0, sizeof(serv));
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = inet_addr(argv[1]);
serv.sin_port = htons(UDP_SERV_PORT);
/* form request[] ... */
if (sendto(sockfd, request, REQUEST, 0,
(SA) &serv, sizeof(serv)) != REQUEST)
err_sys("sendto error");
if ( (n = recvfrom(sockfd, reply, REPLY, 0,
(SA) NULL, (int *) NULL)) < 0)
err_sys("recvfrom error");
/* process "n" bytes of reply[] ... */
exit(0);
}

@ -1,55 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
int
main(int argc, char *argv[])
{
struct sockaddr_in serv;
char request[5000], reply[5000];
int sockfd, n, len, i;
double rtt, minrtt;
if (argc != 2)
err_quit("usage: udpcli <IP address of server>");
if ( (sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
err_sys("socket error");
memset(&serv, sizeof(serv), 0);
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = inet_addr(argv[1]);
serv.sin_port = htons(UDP_SERV_PORT);
/* form request[] ... */
for (len = 0; len <= 1400; len += 100) { /* len = amount of user data */
printf("len = %d\n", len);
minrtt = 9999999;
for (i = 0; i < 30; i++) {
start_timer();
if (sendto(sockfd, request, len, 0,
(SA) &serv, sizeof(serv)) != len)
err_sys("sendto error");
if ( (n = recvfrom(sockfd, reply, sizeof(reply), 0,
(SA) NULL, (int *) NULL)) != len)
err_sys("recvfrom error");
rtt = print_timer();
minrtt = min(minrtt, rtt);
/* process "n" bytes of reply[] ... */
}
printf("min rtt = %9.3f\n\n", minrtt);
}
exit(0);
}

@ -1,42 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
int
main() /* simple UDP server */
{
struct sockaddr_in serv, cli;
char request[REQUEST], reply[REPLY];
int sockfd, n, clilen;
if ( (sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
err_sys("socket error");
memset(&serv, 0, sizeof(serv));
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = htonl(INADDR_ANY);
serv.sin_port = htons(UDP_SERV_PORT);
if (bind(sockfd, (SA) &serv, sizeof(serv)) < 0)
err_sys("bind error");
for ( ; ; ) {
clilen = sizeof(cli);
if ( (n = recvfrom(sockfd, request, REQUEST, 0,
(SA) &cli, &clilen)) < 0)
err_sys("recvfrom error");
/* process "n" bytes of request[] and create reply[] ... */
if (sendto(sockfd, reply, REPLY, 0,
(SA) &cli, sizeof(cli)) != REPLY)
err_sys("sendto error");
}
}

@ -1,49 +0,0 @@
/*
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
* Permission to use or modify this software and its documentation only for
* educational purposes and without fee is hereby granted, provided that
* the above copyright notice appear in all copies. The author makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*/
#include "cliserv.h"
int
main(int argc, char *argv[])
{
struct sockaddr_in serv, cli;
char request[5000], reply[5000];
int sockfd, n, clilen, spt;
if (argc > 1)
spt = atoi(argv[1]); /* optional server processing time, in ms */
else
spt = 0;
if ( (sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
err_sys("socket error");
memset(&serv, sizeof(serv), 0);
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = htonl(INADDR_ANY);
serv.sin_port = htons(UDP_SERV_PORT);
if (bind(sockfd, (SA) &serv, sizeof(serv)) < 0)
err_sys("bind error");
for ( ; ; ) {
clilen = sizeof(cli);
if ( (n = recvfrom(sockfd, request, sizeof(request), 0,
(SA) &cli, &clilen)) < 0)
err_sys("recvfrom error");
/* process "n" bytes of request[] ... */
if (spt)
sleep_us(spt * 1000);
if (sendto(sockfd, reply, n, 0,
(SA) &cli, sizeof(cli)) != n)
err_sys("sendto error");
}
}
Loading…
Cancel
Save