#include < stdio.h >
#include "socketfun.h"
int read1000(int fd, char *chars)
{
int so_far, i;
so_far = 0;
while(so_far < 1000) {
i = read(fd, chars+so_far, 1000-so_far);
if (i == 0) return 0;
so_far += i;
}
return 1;
}
main()
{
int sock;
int fd;
char chars[1000];
char output[20];
FILE *fout;
int nchars;
sock = serve_socket("cetus3a", 15000);
if (sock < 0) { perror("serve_socket"); exit(1); }
fout = fopen("outfile", "w");
if (fout == NULL) { perror("fopen(outfile)"); exit(1); }
nchars = 0;
while (1) {
fd = accept_connection(sock);
if (read1000(fd, chars) != 0) {
fwrite(chars, 1, 1000, fout);
nchars += 1000;
sprintf(output, "%d\n", nchars);
write(fd, output, strlen(output));
}
close(fd);
}
}
Part 1: Turn this into threaded code, where a new thread
is created to service each connection. You will need a mutex
to protect the shared variables. Try to make sure that you do
not lock the mutex longer than you need to. Use the skeleton
in the Answer Sheet to Question 4.
Don't worry about calling pthread_join(). Were we actually
writing this code, we would use the jthread_create()/jthread_exit()
primitives from the
lecture notes on condition variables.
Part 2: Explain the conditions under which your code will be more efficient than the above code, and the conditions under which the two pieces of code perform equally.