Guest

Untitled

By: a guest on Jan 7th, 2011  |  syntax: C  |  size: 5.04 KB  |  hits: 80  |  expires: Never
download  |  raw  |  embed  |  report abuse
Copied
  1. /*
  2.  
  3.    To Compile under Windows:
  4.      cl IACRB_pratical_2.c /link ws2_32.lib
  5.  
  6.    To Compile under Linux or Cygwin:
  7.      make IACRB_pratical_2
  8.  
  9.    To Compile under Sun:
  10.      gcc -lsocket -lnsl IACRB_pratical_2
  11.  
  12.    Running:
  13.      From one command prompt, type "IACRB_pratical_2 5700"
  14.      From another prompt, type "nc 127.0.0.1 5700"
  15.  
  16.  
  17.  */
  18.  
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <stdarg.h>
  23.  
  24. #ifdef _WIN32
  25. #  include <winsock2.h>
  26. #else
  27. #  include <sys/types.h>
  28. #  include <sys/socket.h>
  29. #  include <netinet/in.h>
  30. #  include <unistd.h>
  31. #  define SOCKET int
  32. #endif
  33.  
  34.  
  35.  
  36. #define END_LINE '\n'
  37.  
  38. void logit(FILE *fp, char *client, char *message);
  39. int read_line(int fd, char *buf, int buf_size);
  40. void reverse(char *dest, const char *source);
  41. int write_client(int fd, const char *fmt, ...);
  42. void winsock_init();
  43.  
  44. int main(int argc, char *argv[]) {
  45.     SOCKET listenfd, sockfd;
  46.     int clientLen, serverPort;
  47.     char reversed_line[100];
  48.     struct sockaddr_in clientAddress, serverAddress;
  49.     char line[500];
  50.     FILE *fpLog = NULL;
  51.     int secret = 0xDEADC0DE;
  52.     int clientQuit = 0;
  53.  
  54.     if (argc != 2)
  55.     {
  56.         printf("Usage: %s <port>\n", argv[0]);
  57.         return 1;
  58.     }
  59. #ifdef _WIN32
  60.     winsock_init();
  61. #endif
  62.  
  63.     serverPort = atoi(argv[1]);
  64.     /* create socket */
  65.     listenfd = socket(PF_INET, SOCK_STREAM, 0);
  66.     if ( listenfd < 0 )
  67.     {
  68.         perror("socket error ");
  69.         return 1;
  70.     }
  71.  
  72.     /* bind server port */
  73.     memset(&serverAddress, 0, sizeof(serverAddress));
  74.     serverAddress.sin_family = AF_INET;
  75.     // serverAddress.sin_addr.s_addr = htonl(INADDR_ANY);
  76.     serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
  77.     serverAddress.sin_port = htons(serverPort);
  78.  
  79.     if ( -1 == bind(listenfd, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) )
  80.     {
  81.         perror("bind error");
  82.         return 1;
  83.     }
  84.  
  85.     if (-1 == listen(listenfd, 5))
  86.     {
  87.         perror("listen error");
  88.         return 1;
  89.     }
  90.  
  91.     fpLog = fopen("server.log", "w");
  92.     if (fpLog == NULL)
  93.     {
  94.         perror("couldn't open server.log for writing");
  95.         return 1;
  96.     }
  97.  
  98.     while ( ! clientQuit )
  99.     {
  100.         printf("%s: waiting for connection on TCP port %u\n\n", argv[0], serverPort);
  101.  
  102.         clientLen = sizeof(clientAddress);
  103.         sockfd = accept(listenfd, (struct sockaddr *) &clientAddress, &clientLen);
  104.         if ( -1 == sockfd )
  105.         {
  106.             perror("error accepting connection ");
  107.             return 1;
  108.         }
  109.  
  110.         write_client(sockfd, "Type QUIT on a line by itself to quit\n");
  111.  
  112.         /* init line */
  113.         memset(line, 0, sizeof(line));
  114.  
  115.         clientQuit = 0;
  116.         while ( !clientQuit &&  read_line(sockfd, line, sizeof(line)) != 0)
  117.         {
  118.             printf( "%s:%d %s\n",
  119.                     inet_ntoa(clientAddress.sin_addr),
  120.                     ntohs(clientAddress.sin_port),
  121.                     line);
  122.             if (0 == strncmp(line, "QUIT", 4))
  123.             {
  124.                 clientQuit = 1;
  125.                 write_client(sockfd, "Goodbye\n");
  126.                 close(sockfd);
  127.             }
  128.             else
  129.             {
  130.                 reverse(reversed_line, line);
  131.                 write_client(sockfd, reversed_line);
  132.                 write_client(sockfd, "\n");
  133.                 // logit(fpLog, inet_ntoa(clientAddress.sin_addr), line);
  134.             }
  135.             memset(line, 0, sizeof(line));
  136.         }
  137.     }
  138. #ifdef _WIN32
  139.     WSACleanup();
  140. #endif
  141. }
  142.  
  143. int write_client(int fd, const char *fmt, ...)
  144. {
  145.     va_list args;
  146.     char message[100];
  147.  
  148.     if (fmt == NULL)
  149.         return 0;
  150.     va_start(args, fmt);
  151. #ifdef _WIN32
  152.     vsprintf(message, fmt, args);
  153. #else
  154.     vsnprintf(message, sizeof(message), fmt, args);
  155. #endif
  156.     va_end(args);
  157.     return send(fd, message, strlen(message), 0);
  158. }
  159.  
  160. int read_line(int fd, char *buf, int buf_size)
  161. {
  162.     int nleft, nread, buf_len;
  163.  
  164.     nleft = buf_size;
  165.     while (nleft > 0)
  166.     {
  167.         if ((nread = recv(fd, buf, nleft, 0)) < 0)
  168.         {
  169.             return nread;
  170.         }
  171.         else if (nread == 0)
  172.         {
  173.             break;
  174.         }
  175.         nleft -= nread;
  176.         buf += nread;
  177.         if (*(buf - 1) == END_LINE)
  178.         {
  179.             break;
  180.         }
  181.     }
  182.     buf_len = buf_size - nleft;
  183.     if (buf_len > 0)
  184.     {
  185.         *(buf - 1) = '\0';
  186.     }
  187.  
  188.     return buf_len;
  189. }
  190.  
  191. void logit(FILE *fp, char *client, char *message)
  192. {
  193.     fprintf(fp, "%s", client);
  194.     fprintf(fp, message);
  195.     fprintf(fp, "\n");
  196.     fflush(fp);
  197. }
  198.  
  199. void reverse(char *dest, const char *source)
  200. {
  201.     int len, i;
  202.     len = strlen(source);
  203.     i = 0;
  204.     while (len > 0)
  205.     {
  206.         dest[i++] = source[--len];
  207.     }
  208.     dest[i] = '\0';
  209. }
  210.  
  211. #ifdef _WIN32
  212. void winsock_init()
  213. {
  214.     static WSADATA wsaData;    
  215.     int wsaret;
  216.  
  217.     if (WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR)
  218.     {
  219.         fprintf(stderr, "Couldn't start winsock\n");
  220.         WSACleanup();
  221.         exit(1);
  222.     }
  223. }
  224. #endif