testsf_c.c revision 22853aae7d384d69ae53ca39496c68994b47725d
1
2/*
3 * Client for the send_file test program
4 * Syntax: testsf_c <server IP addr> <client_filename> <filename> <file length>
5 */
6
7#include <stdio.h>
8#include <stdlib.h>
9#include <string.h>
10#include <sys/file.h>
11#include <netinet/in.h>
12#include <sys/socket.h>
13
14extern int errno;
15
16main(argc, argv)
17int argc;
18char *argv[];
19
20{
21  struct sockaddr_in sa;
22  int s, fd;
23  char *lp, *sp;
24  int i;
25  int nbyte;
26  char *serv_fname;
27  char *clnt_fname;
28  char rbuf[81];
29  int flen, nlen;
30  int port;
31
32  /* open socket to server */
33  if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
34	printf("socket error = %d\n", errno);
35	exit(1);
36  }
37
38  clnt_fname = argv[3]; /* filename to create/
39  serv_fname = argv[4]; /* filename to request */
40
41  /* prepare to copy file from server to local machine */
42  if ((fd = open(clnt_fname, O_CREAT | O_TRUNC | O_WRONLY)) < 0) {
43	printf("file open error = %d\n", errno);
44	close(s);
45	exit(1);
46  }
47
48  lp = argv[5]; /* get file size */
49  flen = strtol(lp,(char **)NULL,10);
50
51
52  /* initialize request info: */
53  rbuf[0] = '\0';
54  sp = &rbuf[0];
55  sp = strcat(sp, argv[5]); /* file size */
56  sp = strcat(sp, "=");
57  sp = strcat(sp, argv[4]); /* requested file */
58
59  printf("sp=%s\n",sp);
60  /* initialize server info to make the connection */
61  sa.sin_family = AF_INET;
62  sa.sin_addr.s_addr = inet_addr(argv[1]);
63  port=atoi(argv[2]);
64  sa.sin_port = htons(port);
65
66  if ( connect(s, (struct sockaddr*) &sa, sizeof(sa) ) < 0 ) {
67        printf("connect error = %d\n", errno);
68	close(s);
69	exit(1);
70  }
71
72  /* send request info to server */
73  if ((nbyte = write(s, rbuf, strlen(rbuf))) <= 0) {
74        printf("socket write  error = %d\n", errno);
75	close(s);
76	exit(1);
77  }
78
79printf("client write %d bytes to server with contents %s\n", nbyte, rbuf);
80
81  nlen = 0; /* init size of info received */
82  rbuf[0] = '\0';
83  while ((nbyte = read(s, rbuf, 80)) >0) { /* receive info until EOF */
84    nlen += nbyte;
85    if (write(fd, rbuf, nbyte) != nbyte) {
86      printf("Error writing to file %s on client\n",clnt_fname);
87      exit(1);
88    }
89  }
90
91
92  if (nlen != flen) { /* compare expected size with current size */
93    printf("WRONG!!! nlen = %d, should be %d\n", nlen, flen);
94    exit (1);
95  }
96  else
97    printf("File %s received\n", serv_fname);
98
99  close(s);
100  close(fd);
101  exit(0);
102}
103