title: C: can I forward port for external application with libssh?
body: <p>I'm implementing VNC connection for xen VM in my app. In order to connect I have to forward the port as XenServer accept only local connection.  I do it like this:  </p>
  
  <pre><code>ssh -L 5903:localhost:5903 root@192.168.1.4
  </code></pre>
  
  <p>After it a can connect my VNC to localhost with corresponding port. But I have to frequently reconnect to different hosts, and using bash is not a good idea as I have a windows build also. Installing ssh-client is not always possible.<br>
  I read  <a href="http://api.libssh.org/stable/libssh_tutor_forwarding.html" rel="nofollow">http://api.libssh.org/stable/libssh_tutor_forwarding.html</a>  and tried to test it.  </p>
  
  <pre><code> ssh_channel forwarding_channel;        
      forwarding_channel = ssh_channel_new(session);    
      int rc = channel_open_forward(forwarding_channel,
                                "192.168.1.4", 5903,
                                "localhost", 5903);
      if (rc != SSH_OK)
      {
          ssh_channel_free(forwarding_channel);
          return rc;
      }    
      for(;;)
      {
          usleep(100000);
      }       
  </code></pre>
  
  <p>The tunnel itself is created, according to status. But I can see no ports listening via netstat. What I'm doing wrong and is it possible at all?</p>
  
  <p>Update:</p>
  
  <p>Here is resulted code that seems to work properly using libssh</p>
  
  <pre><code>int32_t forward_port (ssh_session session, char *remote_host, int32_t remote_port, int32_t local_port)
  {   
      int32_t server_sock = 0;    
      int32_t client_sock = -1;
      struct sockaddr_in client_name;
      socklen_t client_name_len = sizeof client_name;
      char buf[4096] = {0};
      server_sock = server_startup(local_port);
      client_sock = accept(server_sock,
                           (struct sockaddr *)&amp;client_name,
                           &amp;client_name_len);
      if (client_sock == -1)
      {
          perror("Error on accept");
          return SSH_ERROR;
      }
      int32_t client_port = ntohs(client_name.sin_port);  
      int32_t size_recv, nwritten, nread = 0;
      uint8_t data[4096];
      fcntl(client_sock, F_SETFL, O_NONBLOCK);
      /*  */
      ssh_channel forwarding_channel;
      forwarding_channel = ssh_channel_new(session);
      int rc = channel_open_forward(forwarding_channel,
                                    remote_host, remote_port,
                                    "127.0.0.1", client_port);
      if (rc != SSH_OK)
      {
          ssh_channel_free(forwarding_channel);
          close(client_sock);
          close(server_sock);
          return rc;
      }
      while(!ssh_channel_is_eof (forwarding_channel)) 
      {
          if((size_recv = recv(client_sock, data, sizeof data, MSG_DONTWAIT) ) &lt; 0)
          {
              if((nread = ssh_channel_read_nonblocking(forwarding_channel, data, sizeof data, 0))&gt;0)
              {
                  if(write(client_sock,data,nread)&lt;0)
                  {                   
                      perror("Error writing to socket");
                      close(client_sock);
                      close(server_sock);
                      ssh_channel_free(forwarding_channel);
                      return SSH_ERROR;
                  }               
              }
  
          }       
          else if (!size_recv)
          {
              puts("Local client disconnected, exiting");
              goto exit;  
          }
          nwritten = channel_write(forwarding_channel, data, size_recv);
              if (size_recv != nwritten)
              {
                  ssh_channel_free(forwarding_channel);
                  return SSH_ERROR;
              }
      }
  exit:
      close(client_sock);
      close(server_sock);
      ssh_channel_free(forwarding_channel);
      return SSH_OK;
  }
  </code></pre>