#include #include #include #include #include #include #include #include #include #include char *END_FLAG = "=================END"; #define HEXCONVERT_COLS 8 #define HEX_CONVERT 1 //#define DEBUG 1 #define out(fmt, arg...) (void)printf(fmt, ##arg) #ifdef DEBUG #define DBG(fmt, arg...) do { \ out("[Debug] " fmt, ##arg); \ } while (0) #else #define DBG(fmt, arg...) ((void)0) #endif void error (const char *msg) { perror (msg); out ("./client_tcp [server_ip_address] [port number] [filename] [client_ip_address]\n"); exit (1); } #if defined(HEX_CONVERT) && defined(DEBUG) void hexconvert (void *mem, unsigned int len) { unsigned int i; for (i = 0; i < len + ((len % HEXCONVERT_COLS) ? (HEXCONVERT_COLS - len % HEXCONVERT_COLS) : 0); i++) { /* print offset */ if (i % HEXCONVERT_COLS == 0) { DBG ("\n0x%06x: ", i); } /*print hex data */ if (i < len) { DBG ("%02x ", 0xFF & ((char *) mem)[i]); } else /* end of block, just aligning for ASCII dump */ { DBG ("\n"); } } } #endif void tcp (char **pArgv) { int sockfd, portno; char buff[1024]; struct sockaddr_in serv_addr, cli_addr; struct hostent *server; sockfd = socket (AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { error ("error in socket creation\n"); } out ("socket create successful\n"); portno = atoi (pArgv[2]); server = gethostbyname (pArgv[1]); if (server == NULL) { fprintf (stderr, "error no such host\n"); } bzero ((char *) &serv_addr, sizeof (serv_addr)); serv_addr.sin_family = AF_INET; bcopy ((char *) server->h_addr, (char *) &serv_addr.sin_addr, server->h_length); serv_addr.sin_port = htons (portno); bzero ((char *) &cli_addr, sizeof (serv_addr)); cli_addr.sin_family = AF_INET; cli_addr.sin_addr.s_addr = inet_addr (pArgv[4]); cli_addr.sin_port = htons (portno); if (bind (sockfd, (struct sockaddr *) &cli_addr, sizeof (cli_addr)) < 0) { error ("bind fail"); } out ("Bind successful\n"); if (connect (sockfd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0) { error ("connection fail"); } out ("connection done\n"); FILE *file; int filebyte = 0; int lsize, totalsize = 0; file = fopen (pArgv[3], "r"); fseek (file, 0, SEEK_END); lsize = ftell (file); rewind (file); out ("Name of file: %s, Size of file : %d\n", pArgv[3], lsize); if (write (sockfd, &lsize, sizeof (int)) == -1) { out ("error executing write\n"); } if (write (sockfd, pArgv[3], 255) == -1) { out ("error executing write\n"); } while (lsize > totalsize) { bzero (buff, 1024); fseek (file, totalsize, SEEK_SET); filebyte = fread (buff, 1, sizeof (buff), file); if (filebyte == 0) { printf ("file End of file\n"); break; } if (filebyte < 0) error ("error in reading file. \n"); #if defined(HEX_CONVERT) && defined(DEBUG) DBG ("=========================================\n"); hexconvert (buff, filebyte); DBG ("=========================================\n"); #endif void *p = buff; totalsize += filebyte; while (filebyte > 0) { #ifdef DEBUG DBG ("=========================================\n"); puts ((const char *) p); DBG ("=========================================\n"); #endif int bytes_written = write (sockfd, p, filebyte); if (bytes_written <= 0) { error ("error in Socket write.\n"); } filebyte -= bytes_written; p += bytes_written; //#if DEBUG DBG ("Total size of file = %d, Total Bytes sent to socket = %d, bytes_written in each step = %d\n", lsize, totalsize, bytes_written); //#endif } } out ("file has been sent successfully\n"); out ("Final Total size of file = %d, Total Bytes sent to socket = %d\n", lsize, totalsize); fclose (file); sleep (60); close (sockfd); return; } void udp (char **pArgv) { int sockfd, n, fd, sz, portno, MAXLINE; FILE *fp; struct sockaddr_in servaddr, cliaddr; char *buf; char *target, *path; portno = atoi (pArgv[2]); bzero (&servaddr, sizeof (servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons (portno); servaddr.sin_addr.s_addr = inet_addr (pArgv[1]); bzero (&cliaddr, sizeof (servaddr)); cliaddr.sin_family = AF_INET; cliaddr.sin_port = htons (portno); cliaddr.sin_addr.s_addr = inet_addr (pArgv[3]); sockfd = socket (AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { out ("error in socket creation\n"); } out ("socket create successful\n"); if (bind (sockfd, (struct sockaddr *) &cliaddr, sizeof (cliaddr)) < 0) { out ("bind fail"); } out ("Bind successful\n"); path = pArgv[4]; target = pArgv[5]; MAXLINE = atoi (pArgv[6]); buf = malloc (MAXLINE * sizeof (int)); fp = fopen (path, "r"); fseek (fp, 0L, SEEK_END); sz = ftell (fp); out ("The size of the path file is %d", sz); sendto (sockfd, target, strlen (target), 0, (struct sockaddr *) &servaddr, sizeof (servaddr)); n = recvfrom (sockfd, buf, MAXLINE, 0, NULL, NULL); if (!strncmp (buf, "ok", 2)) { out ("Filename sent.\n"); } fd = open (path, O_RDONLY); while ((n = read (fd, buf, MAXLINE)) > 0) { sendto (sockfd, buf, n, 0, (struct sockaddr *) &servaddr, sizeof (servaddr)); } sendto (sockfd, END_FLAG, strlen (END_FLAG), 0, (struct sockaddr *) &servaddr, sizeof (servaddr)); fclose (fp); sleep (60); close (sockfd); return; } int main (int argc, char *argv[]) { int i; char **pArgv, str[10]; pArgv = (char **) malloc (sizeof (char *) * 10); for (i = 0; i < 10; i++) { pArgv[i] = (char *) malloc (sizeof (char) * 20); } printf ("%s", argv[1]); if (strcmp ("tcp", argv[1]) == 0) { strcpy (pArgv[0], "tcp"); printf ("pArgv[0]=%s", pArgv[0]); /* The arguments of tcp are [server_ip_address] [port number] [filename] [client_ip_address] */ for (i = 1; i < 5; i++) { strcpy (pArgv[i], argv[i + 1]); } tcp (pArgv); } else { strcpy (str, argv[1]); if (strcmp ("udp", str) == 0) { strcpy (pArgv[0], "udp"); printf ("pArgv[0]=%s", pArgv[0]); /* The arguments of udp are [server_ip_address] [port number] [client_ip_address] [filename] [target_filename] [MAX_BUFFER_LENGTH] */ for (i = 1; i < 7; i++) { strcpy (pArgv[i], argv[i + 1]); } udp (pArgv); } } return 0; }