title: Amazon EC2 Socket Programming (C)
body: <p>I'm basically trying to read accelerometer data on Raspberry Pi (my client) and send them over to the server (EC2 ubuntu instance).</p>
  
  <p>This is my client code:</p>
  
  <pre><code>#include "./sensor.h"
  #include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;unistd.h&gt;
  #include &lt;string.h&gt;
  #include &lt;sys/types.h&gt;
  #include &lt;sys/socket.h&gt;
  #include &lt;netinet/in.h&gt;
  #include &lt;netdb.h&gt; 
  
  void error(const char *msg)
  {
      perror(msg);
      exit(0);
  }
  
  int main(int argc, char *argv[])
  {
      int sockfd, portno, n;
      struct sockaddr_in serv_addr;
      struct hostent *server;
  
      char buffer[256];
      if (argc &lt; 4) {
         fprintf(stderr,"usage %s hostname port\n", argv[0]);
         exit(0);
      }
      int delay = atoi(argv[3]);
      portno = atoi(argv[2]);
      sockfd = socket(AF_INET, SOCK_STREAM, 0);
      if (sockfd &lt; 0) 
          error("ERROR opening socket");
      server = gethostbyname(argv[1]);
      if (server == NULL) {
          fprintf(stderr,"ERROR, no such host\n");
          exit(0);
      }
      bzero((char *) &amp;serv_addr, sizeof(serv_addr));
      serv_addr.sin_family = AF_INET;
      bcopy((char *)server-&gt;h_addr, 
           (char *)&amp;serv_addr.sin_addr.s_addr,
           server-&gt;h_length);
      serv_addr.sin_port = htons(portno);
      if (connect(sockfd,(struct sockaddr *) &amp;serv_addr,sizeof(serv_addr)) &lt; 0) 
          error("ERROR connecting");
      int acc[6];
      enableIMU();
      while(1){
      bzero(buffer,256);
      readACC(acc);
      sprintf(buffer,"%d\t%d\t%d\t\n", acc[0], acc[1], acc[2]);
      n = write(sockfd,buffer,strlen(buffer));
      if (n &lt; 0) 
           error("ERROR writing to socket");
      if (n &lt; 0) 
           error("ERROR reading from socket");
      printf("%s\n",buffer);
      }
      close(sockfd);
      return 0;
  }
  </code></pre>
  
  <p>And here is my server code:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  #include &lt;unistd.h&gt;
  #include &lt;sys/types.h&gt; 
  #include &lt;sys/socket.h&gt;
  #include &lt;netinet/in.h&gt;
  
  void error(const char *msg)
  {
      perror(msg);
      exit(1);
  }
  
  int main(int argc, char *argv[])
  {
       int sockfd, newsockfd, portno;
       socklen_t clilen;
       char buffer[256];
       struct sockaddr_in serv_addr, cli_addr;
       int n;
       if (argc &lt; 2) {
           fprintf(stderr,"ERROR, no port provided\n");
           exit(1);
       }
       sockfd = socket(AF_INET, SOCK_STREAM, 0);
       if (sockfd &lt; 0) 
          error("ERROR opening socket");
       bzero((char *) &amp;serv_addr, sizeof(serv_addr));
       portno = atoi(argv[1]);
       serv_addr.sin_family = AF_INET;
       serv_addr.sin_addr.s_addr = INADDR_ANY;
       serv_addr.sin_port = htons(portno);
       if (bind(sockfd, (struct sockaddr *) &amp;serv_addr,
                sizeof(serv_addr)) &lt; 0) 
                error("ERROR on binding");
       listen(sockfd,5);
       clilen = sizeof(cli_addr);
       newsockfd = accept(sockfd, 
                   (struct sockaddr *) &amp;cli_addr, 
                   &amp;clilen);
       if (newsockfd &lt; 0) 
            error("ERROR on accept");
       bzero(buffer,256);
       n = read(newsockfd,buffer,255);
       if (n &lt; 0) error("ERROR reading from socket");
       printf("Here is the message: %s\n",buffer);
       n = write(newsockfd,"I got your message",18);
       if (n &lt; 0) error("ERROR writing to socket");
       close(newsockfd);
       close(sockfd);
       return 0; 
  }
  </code></pre>
  
  <p>I put this in command line on my client and see my accelerometer readings:</p>
  
  <pre><code>./client ec2-54-187-93-10.us-west-2.compute.amazonaws.com 8000
  </code></pre>
  
  <p>I then put this line on my server and see nothing:</p>
  
  <pre><code>./server 8000
  </code></pre>
  
  <p>This is the security group of my instance:</p>
  
  <pre><code>Type            Protocol          Port Range               Source
  HTTP              TCP                 80                  0.0.0.0/0
  Custom TCP Rule   TCP                8000                 0.0.0.0/0
  SSH               TCP                 22                  0.0.0.0/0
  </code></pre>
  
  <p>Do you know what I'm doing wrong? I would really appreciate your help.</p>