[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
libssh: 0.5 ssh_connect hangs if you connect your own socket
[Thread Prev] | [Thread Next]
- Subject: libssh: 0.5 ssh_connect hangs if you connect your own socket
- From: "Mark Riordan" <mriordan@xxxxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Tue, 17 May 2011 14:49:44 -0500
- To: <libssh@xxxxxxxxxx>
I'm attempting to switch over from libssh 0.4.8 to 0.5 (RC), and I'm having a problem when I try to connect the socket myself instead of relying on ssh_connect to do so: ssh_connect never returns. On Windows, it chews up 100% of the CPU; on Linux, it just hangs. This works under 0.4.8. Here's a test program: -------------------- // libsshmrr2.cpp - Program to test hang in libssh's ssh_connect when // you use your own socket. // Mark Riordan 2011-05-17 #include <stdio.h> #include <string> #ifdef WIN32 #else #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <errno.h> #define SOCKET int #endif #include "libssh/libssh.h" using namespace std; int doSSH() { ssh_session session; session=ssh_new(); struct struct_settings { string host; int port; string user; int verbosity; } settings; settings.host="172.16.22.182"; settings.port = 22; settings.user="mrr"; settings.verbosity=SSH_LOG_FUNCTIONS; printf("libssh version: %s\n", ssh_version(0)); if (ssh_options_set(session, SSH_OPTIONS_USER, settings.user.c_str()) < 0) { printf("Could not set user\n"); return 22; } bool bUsingOwnSocket=true; if(bUsingOwnSocket) { #ifdef WIN32 WSADATA wsadata; WSAStartup(MAKEWORD(2, 0), &wsadata); #endif SOCKET sock = socket(AF_INET, SOCK_STREAM, 0); unsigned long hostaddr = inet_addr(settings.host.c_str()); struct sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(settings.port); sin.sin_addr.s_addr = hostaddr; if (connect(sock, (struct sockaddr *) (&sin), sizeof(struct sockaddr_in)) != 0) { #ifdef WIN32 int err = WSAGetLastError(); #else int err = errno; #endif printf("Failed to connect: error %d\n", err); return 20; } else { printf("Connected our own socket to %s\n", settings.host.c_str()); } if (ssh_options_set(session, SSH_OPTIONS_FD, &sock) < 0) { return 21; } } else { if (ssh_options_set(session, SSH_OPTIONS_HOST, settings.host.c_str()) < 0) { printf("Could not set host\n"); return 23; } } ssh_options_set(session, SSH_OPTIONS_LOG_VERBOSITY, &settings.verbosity); if(ssh_connect(session)){ fprintf(stderr,"Connection failed : %s\n",ssh_get_error(session)); ssh_disconnect(session); return 24; } else { printf("ssh_connect succeeded.\n"); } return 0; } int main(int argc, char* argv[]) { int retval = doSSH(); printf("Press Enter to exit: "); getchar(); return retval; } -------------------- ssh_connect succeeds if I set bUsingOwnSocket to false. If I set it to true, I get output like this on Linux: Connected our own socket to 172.16.22.182 [func] entering function ssh_connect line 628 in /home/mrr/dist/master/src/client.c [1] libssh 0.5.0 (c) 2003-2010 Aris Adamantiadis (aris@xxxxxxxxxxxx) Distributed under the LGPL, please refer to COPYING file for information about your rights, using threading threads_noop [2] Socket connecting, now waiting for the callbacks to work [func] entering function ssh_handle_packets line 420 in /home/mrr/dist/master/src/session.c (then nothing) On Windows, I get: Connected our own socket to 172.16.22.182 [func] entering function ssh_connect line 628 in ..\..\src\client.c [1] libssh 0.5.0 (c) 2003-2010 Aris Adamantiadis (aris@xxxxxxxxxxxx) Distributed under the LGPL, please refer to COPYING file for information about your rights, using threading threads_noop [2] Socket connecting, now waiting for the callbacks to work [func] entering function ssh_handle_packets line 436 in ..\..\src\session.c [func] leaving function ssh_handle_packets line 449 in ..\..\src\session.c [func] entering function ssh_handle_packets line 436 in ..\..\src\session.c [func] leaving function ssh_handle_packets line 449 in ..\..\src\session.c ... (endless loop of last two lines) I think that the problem under Windows is that in poll.c's bsd_poll, ssh_pollfd_t events==0, and hence bsd_poll is returning an error without even bothering to call select(). I get the same symptoms with both 0.4.91 from 2011-03-23, and today's version from git. Any ideas? Thanks, Mark R
Re: libssh: 0.5 ssh_connect hangs if you connect your own socket | "Oliver Stöneberg" <oliverst@xxxxxxxxx> |