#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 ("./server_tcp [server_ip_address] [port number]\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 int compareFiles (FILE * fp1, FILE * fp2) { char ch1 = getc (fp1); char ch2 = getc (fp2); int error = 0, pos = 0, line = 1; while (ch1 != EOF && ch2 != EOF) { pos++; if (ch1 == '\n' && ch2 == '\n') { line++; pos = 0; } if (ch1 != ch2) { error++; DBG ("Line Number : %d \tError" " Position :%d \n", line, pos); } ch1 = getc (fp1); ch2 = getc (fp2); } //printf("Total Errors : %d\t", error); return error; } void tcp (char **pArgv) { int sockfd, newsockfd, portno; char buff[1024], filename[255]; struct sockaddr_in serv_addr, cli_addr; socklen_t clilen; sockfd = socket (AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { error ("error in socket creation"); } out ("socket create successful\n"); bzero ((char *) &serv_addr, sizeof (serv_addr)); portno = atoi (pArgv[2]); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr (pArgv[1]); serv_addr.sin_port = htons (portno); if (bind (sockfd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0) { error ("bind fail"); } out ("Bind successful\n"); listen (sockfd, 5); clilen = sizeof (cli_addr); newsockfd = accept (sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) { error ("error in accept"); } out ("socket accept succesful\n"); bzero (buff, 1024); FILE *fp; int lSize = 0, totallSize = 0; bzero (filename, 255); fclose (fopen ("receive_file.txt", "w")); if (system ("chmod +x *") == -1) { out (" incorrect use of system\n"); } fp = fopen ("receive_file.txt", "a"); if (read (newsockfd, &lSize, sizeof (int)) == -1) { out ("error executing read\n"); } if (read (newsockfd, filename, sizeof (filename)) == -1) { out ("error executing read\n"); } while (lSize > totallSize) { int bytes_read = 0; bzero (buff, 1024); bytes_read = read (newsockfd, buff, 1024); if (bytes_read == 0) { break; } if (bytes_read < 0) { error ("error in Socket read.\n"); } #if defined(HEX_CONVERT) && defined(DEBUG) DBG ("=========================================\n"); hexconvert (buff, bytes_read); DBG ("=========================================\n"); #endif #ifdef DEBUG DBG ("=========================================\n"); puts ((const char *) buff); DBG ("=========================================\n"); #endif totallSize += bytes_read; if (fwrite (buff, 1, bytes_read, fp) == -1) { error ("error in file write\n"); } //#if DEBUG DBG ("Total size of file = %d, Total Bytes sent to socket = %d, bytes_read in each step = %d\n", lSize, totallSize, bytes_read); //#endif } out ("file name = %s\n", filename); out ("Final total size of file = %d, total read from socket = %d\n", lSize, totallSize); out ("copy complete\n"); fclose (fp); FILE *fp1 = fopen ("receive_file.txt", "r"); FILE *fp2 = fopen (filename, "r"); fseek (fp2, 0L, SEEK_END); int lfile_size = ftell (fp2); rewind (fp2); if (lfile_size != lSize) { out ("Size unmatch...\n"); } else { out ("Size match...\n"); } if (compareFiles (fp1, fp2) > 0) { out ("file unmatch...\n"); } else { out ("file match...\n"); } close (newsockfd); close (sockfd); return; } void run (int sockfd, struct sockaddr *cliaddr, socklen_t clilen, char *res_buf, int MAXLINE) { int n, fd; socklen_t len; char *buf, *buf2; FILE *fp1, *fp2; buf = malloc (MAXLINE + 1); len = clilen; n = recvfrom (sockfd, buf, MAXLINE, 0, cliaddr, &len); buf[n] = 0; out ("Received from client:[%s] \n", buf); buf2 = malloc (MAXLINE); strcpy (buf2, buf); sendto (sockfd, "ok", strlen ("ok"), 0, cliaddr, len); fd = open (buf, O_RDWR | O_CREAT, 0666); while ((n = recvfrom (sockfd, buf, MAXLINE, 0, cliaddr, &len))) { buf[n] = 0; //out("%s", buf); if (!(strcmp (buf, END_FLAG))) { break; } if (write (fd, buf, n) == -1) { out ("error in executing write\n"); } } fp1 = fopen (buf2, "r"); fp2 = fopen (res_buf, "r"); if (compareFiles (fp1, fp2) == 0) { out ("\nPass:The contents of the files are same"); } else { out ("\nFail:The contents of the files are different"); } close (fd); } void udp (char **pArgv) { int sockfd, portno, MAXLINE; struct sockaddr_in servaddr, cliaddr; char *res_buf; res_buf = pArgv[3]; portno = atoi (pArgv[2]); MAXLINE = atoi (pArgv[4]); sockfd = socket (AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { out ("error in socket creation\n"); } out ("socket create successful\n"); bzero (&servaddr, sizeof (servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = inet_addr (pArgv[1]); servaddr.sin_port = htons (portno); if (bind (sockfd, (struct sockaddr *) &servaddr, sizeof (servaddr)) < 0) { out ("bind fail"); } out ("Binded successfully\n"); fd_set read_fds; FD_ZERO (&read_fds); FD_SET (sockfd, &read_fds); int fdmax = sockfd; if (FD_ISSET (sockfd, &read_fds)) { run (fdmax, (struct sockaddr *) &cliaddr, sizeof (cliaddr), res_buf, MAXLINE); } return; } int main (int argc, char *argv[]) { int i, j; char **pArgv; pArgv = (char **) malloc (sizeof (char *) * 10); for (i = 0; i < 10; i++) { pArgv[i] = (char *) malloc (sizeof (char) * 20); } if (strcmp ("tcp", argv[1]) == 0) { strcpy (pArgv[0], "tcp"); /* The arguments of tcp are [server_ip_address] [port number] */ for (i = 1; i < 3; i++) { strcpy (pArgv[i], argv[i + 1]); } tcp (pArgv); } else if (strcmp ("udp", argv[1]) == 0) { strcpy (pArgv[0], "udp"); /* The arguments of udp are [server_ip_address] [port number] [filename] [MAX_BUFFER_LENGTH] */ for (i = 1; i < 5; i++) { strcpy (pArgv[i], argv[i + 1]); } udp (pArgv); } return 0; }