title: how to establish sip session in .c programming between client and server
body: <p>this is client server application I want to establish SIP (session initiation protocol) between client and server.</p>
  
  <p>So please anyone guide me how can I do this.</p>
  
  <hr>
  
  <p><i>server.c:</i></p>
  
  <hr>
  
  <pre><code>#include  &lt;stdio.h&gt;
  #include  &lt;stdlib.h&gt;
  #include  &lt;unistd.h&gt;
  #include  &lt;errno.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;arpa/inet.h&gt;
  #include  &lt;sys/wait.h&gt; 
  #include  &lt;signal.h&gt;
  #include &lt;netinet/tcp.h&gt;
  
  #define MYPORT 3490 // the port users will be connecting to
  #define BACKLOG 10    // how many pending connections queue will hold
  #define MAXDATASIZE 100
  
  void str_server(int); 
  
  void sigchld_handler(int s)
  {
   while(waitpid(-1, NULL, WNOHANG) &gt; 0);
  }
  int main(void)
  {
   int sockfd, numbytes,new_fd, optlen; // listen on sock_fd, new connection on new_fd
   struct sockaddr_in my_addr; // my address information
   struct sockaddr_in their_addr; // connector's address information
   struct tcp_info info;
   socklen_t sin_size;
   struct sigaction sa;
   char buf[MAXDATASIZE];
   int yes=1;
   if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
       perror("socket");
       exit(1);
   }
   if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &amp;yes, sizeof(int)) == -1) {
       perror("setsockopt");
       exit(1);
   }
   my_addr.sin_family = AF_INET;         // host byte order
   my_addr.sin_port = htons(MYPORT);     // short, network byte order
   my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
   memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero);
   if (bind(sockfd, (struct sockaddr *)&amp;my_addr, sizeof my_addr) == -1) {
       perror("bind");
       exit(1);
   }
   if (listen(sockfd, BACKLOG) == -1) {
       perror("listen");
       exit(1);
   }
   sa.sa_handler = sigchld_handler; // reap all dead processes
   sigemptyset(&amp;sa.sa_mask);
   sa.sa_flags = SA_RESTART;
   if (sigaction(SIGCHLD, &amp;sa, NULL) == -1) {
       perror("sigaction");
       exit(1);
   }
   while(1) { // main accept() loop
       sin_size = sizeof their_addr;
       getchar();
       if ((new_fd = accept(sockfd, (struct sockaddr *)&amp;their_addr, \
               &amp;sin_size)) == -1) {
           perror("accept");
           continue;
       }
       printf("server: got connection from %s\n", \
           inet_ntoa(their_addr.sin_addr));
  
       if (!fork()) { // this is the child process
           close(sockfd); // child doesn't need the listener
           if ((numbytes=recv(new_fd, buf, MAXDATASIZE-1, 0)) == -1) {
              perror("recv");
              exit(1);
          }
          buf[numbytes] = '\0';
          printf("Received From Client: %s\n",buf);
  
   str_server(sockfd);
   FILE *fp = fopen( "adventure.mpg", "rb" );
   //if(!fork())
   // execlp("gedit", "gedit", "SIPFILE.txt", NULL);
              //system("popen /home/umair/Documents/CurrentData/SIPFILE.txt");
       //ShellExecute(GetDesktopWindow(), "open","ls /home/umair/Documents 
  
              /CurrentData/SIPFILE.txt",NULL, NULL, SW_SHOW);
           if (send(new_fd, "Hello, world!\n", 14, 0) == -1)
               perror("send");
           close(new_fd);
           exit(0);
       }
       close(new_fd); // parent doesn't need this
  
   }
   return 0;
   }
  
  void str_server(int sock) 
  { 
   char buf[1025]; 
   const char* filename = "test.text"; 
   FILE *file = fopen(filename, "rb"); 
   if (!file)
  {
      printf("Can't open file for reading"); 
      return;
  }
  while (!feof(file)) 
  { 
      int rval = fread(buf, 1, sizeof(buf), file); 
      if (rval &lt; 1)
      {
          printf("Can't read from file");
          fclose(file);
          return;
      }
  
      int off = 0;
      do
      {
          int sent = send(sock, &amp;buf[off], rval - off, 0);
          if (sent &lt; 1)
          {
              // if the socket is non-blocking, then check
              // the socket error for WSAEWOULDBLOCK/EAGAIN
              // (depending on platform) and if true then
              // use select() to wait for a small period of
              // time to see if the socket becomes writable
              // again before failing the transfer...
  
              printf("Can't write to socket");
              fclose(file);
              return;
          }
  
          off += sent;
      }
      while (off &lt; rval);
  } 
  
  fclose(file);
  }
  </code></pre>
  
  <hr>
  
  <p><i>//client.c :</i></p>
  
  <hr>
  
  <pre><code>#include  &lt;stdio.h&gt;
  #include  &lt;stdlib.h&gt;
  #include  &lt;unistd.h&gt;
  #include  &lt;errno.h&gt;
  #include  &lt;string.h&gt;
  #include  &lt;netdb.h&gt;
  #include  &lt;sys/types.h&gt;
  #include  &lt;netinet/in.h&gt;
  #include  &lt;sys/socket.h&gt;
  #include &lt;netinet/tcp.h&gt;
  #define PORT 3490 // the port client will be connecting to
  #define MAXDATASIZE 100 // max number of bytes we can get at once
  
  void RecvFile(int , const char* );
  FILE *filename;
  
  int main(int argc, char *argv[])
  {
   int sockfd, numbytes, optlen;
   char buf[MAXDATASIZE];
   char *message;
   struct hostent *he;
   struct tcp_info info;
   struct sockaddr_in their_addr; // connector's address information
   if (argc != 2) {
       fprintf(stderr,"usage: client hostname\n");
       exit(1);
   }
  if ((he=gethostbyname(argv[1])) == NULL) {   // get the host info
       herror("gethostbyname");
  
       exit(1);
   }
   if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
       perror("socket");
       exit(1);
   }
   their_addr.sin_family = AF_INET;    // host byte order
   their_addr.sin_port = htons(PORT); // short, network byte order
   their_addr.sin_addr = *((struct in_addr *)he-&gt;h_addr);
   memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero);
   if (connect(sockfd, (struct sockaddr *)&amp;their_addr,
                                         sizeof their_addr) == -1) {
       perror("connect");
       exit(1);
   }
   printf("connect successfull\n");
  /* if (send(sockfd, "Hello, world!\n", 14, 0) == -1)
       perror("send");
   printf("send successfull\n");
  */    
   message = "GET /?st=1 HTTP/1.1\r\nHost: www.msn.com\r\n\r\n";
  if( send(sockfd , message , strlen(message) , 0) &lt; 0)
  {
      puts("Send failed");
      return 1;
  }
  puts("Data Send\n");
    RecvFile(sockfd , message);
  
   optlen = sizeof(info);
   if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
       perror("recv");
       exit(1);
   }
   buf[numbytes] = '\0';
   printf("Received: %s\n",buf);
   close(sockfd);
  
   return 0;
   }
  
  
  void RecvFile(int sock, const char* filename) 
  { 
  int rval; 
  char buf[0x1000]; 
  FILE *file = fopen(filename, "wb"); 
  if (!file)
  {
      printf("Can't open file for writing");
      return;
  }
  
  do
  {
      rval = recv(sock, buf, sizeof(buf), 0);
      if (rval &lt; 0)
      {
          // if the socket is non-blocking, then check
          // the socket error for WSAEWOULDBLOCK/EAGAIN
          // (depending on platform) and if true then
          // use select() to wait for a small period of
          // time to see if the socket becomes readable
          // again before failing the transfer...
  
          printf("Can't read from socket");
          fclose(file);
          return;
      }
  
      if (rval == 0)
          break;
  
      int off = 0;
      do
      {
          int written = fwrite(&amp;buf[off], 1, rval - off, file);
          if (written &lt; 1)
          {
              printf("Can't write to file");
              fclose(file);
              return;
          }
  
          off += written;
      }   
      while (off &lt; rval);
  } 
  while (!feof(file)); 
  fclose(file); 
  }
  
  Any Suggestion?
  </code></pre>