title: socket connection failed, telnet OK
body: <p>my problem is that I can't connect two comps through socket (windows xp and windows7) although the server created with socket is listening and I can telnet it. It receives then information and does what should be done, but if I run the corresponding socket client I get error 10061. Moreover I am behind firewall - these two comps are running within my LAN, the windows firewalls are turned off,</p>
  
  <p>comp1 [client]: 192.168.1.2 port 12345</p>
  
  <p>comp2 [server]: 192.168.1.5 port 12345</p>
  
  <p>router: 192.168.1.1</p>
  
  <p>Maybe port forwarding could help? But most important for me is to answer why Sockets fail if telnet works fine.</p>
  
  <p>client:</p>
  
  <pre><code> int main(){
          // Initialize Winsock.
          WSADATA wsaData;
          int iResult = WSAStartup(MAKEWORD(2,2), &amp;wsaData);
          if (iResult != NO_ERROR)
               printf("Client: Error at WSAStartup().\n");
          else
               printf("Client: WSAStartup() is OK.\n");
          // Create a socket.
          SOCKET m_socket;
          m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  
          if (m_socket == INVALID_SOCKET){
              printf("Client: socket() - Error at socket(): %ld\n", WSAGetLastError());
              WSACleanup();
              return 7;
          }else
             printf("Client: socket() is OK.\n");
  
          // Connect to a server.
          sockaddr_in clientService;
  
          clientService.sin_family = AF_INET;
          //clientService.sin_addr.s_addr = inet_addr("77.64.240.156");
          clientService.sin_addr.s_addr = inet_addr("192.168.1.5");
          //clientService.sin_addr.s_addr = inet_addr("87.207.222.5");
          clientService.sin_port = htons(12345);
  
          if (connect(m_socket, (SOCKADDR*)&amp;clientService, sizeof(clientService)) == SOCKET_ERROR){
              printf("Client: connect() - Failed to connect.\n");
              wprintf(L"connect function failed with error: %ld\n", WSAGetLastError());
              iResult = closesocket(m_socket);
              if (iResult == SOCKET_ERROR)
              wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
              WSACleanup();
              return 6;
          }
  
          // Send and receive data
          int bytesSent;
          int bytesRecv = SOCKET_ERROR;
          // Be careful with the array bound, provide some checking mechanism
          char sendbuf[200] = "Client: Sending some test string to server...";
          char recvbuf[200] = "";
  
          bytesSent = send(m_socket, sendbuf, strlen(sendbuf), 0);
          printf("Client: send() - Bytes Sent: %ld\n", bytesSent);
  
          while(bytesRecv == SOCKET_ERROR){
              bytesRecv = recv(m_socket, recvbuf, 32, 0);
              if (bytesRecv == 0 || bytesRecv == WSAECONNRESET){
                  printf("Client: Connection Closed.\n");
                  break;
              }else
                  printf("Client: recv() is OK.\n");
  
              if (bytesRecv &lt; 0)
                  return 0;
              else
                  printf("Client: Bytes received - %ld.\n", bytesRecv);
          }
          system("pause");
          return 0;
      }
  </code></pre>
  
  <p>server:</p>
  
  <pre><code>int main(){
  WORD wVersionRequested;
  WSADATA wsaData={0};
  int wsaerr;
  
  // Using MAKEWORD macro, Winsock version request 2.2
  wVersionRequested = MAKEWORD(2, 2);
  wsaerr = WSAStartup(wVersionRequested, &amp;wsaData);
  if (wsaerr != 0){
      /* Tell the user that we could not find a usable WinSock DLL.*/
      printf("Server: The Winsock dll not found!\n");
      return 0;
  }else{
         printf("Server: The Winsock dll found!\n");
         printf("Server: The status: %s.\n", wsaData.szSystemStatus);
  }
  
  /* Confirm that the WinSock DLL supports 2.2.*/
  /* Note that if the DLL supports versions greater    */
  /* than 2.2 in addition to 2.2, it will still return */
  /* 2.2 in wVersion since that is the version we      */
  /* requested.                                        */
  if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2 ){
  /* Tell the user that we could not find a usable WinSock DLL.*/
  printf("Server: The dll do not support the Winsock version %u.%u!\n", LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion));
         WSACleanup();
         return 0;
  }else{
         printf("Server: The dll supports the Winsock version %u.%u!\n", LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion));
         printf("Server: The highest version this dll can support: %u.%u\n", LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion));
  }
  //////////Create a socket////////////////////////
  //Create a SOCKET object called m_socket.
  SOCKET m_socket;
  // Call the socket function and return its value to the m_socket variable.
  // For this application, use the Internet address family, streaming sockets, and the TCP/IP protocol.
  // using AF_INET family, TCP socket type and protocol of the AF_INET - IPv4
  m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  
  // Check for errors to ensure that the socket is a valid socket.
  if (m_socket == INVALID_SOCKET){
      printf("Server: Error at socket(): %ld\n", WSAGetLastError());
      WSACleanup();
      //return 0;
  }else{
      printf("Server: socket() is OK!\n");
  }
  
  ////////////////bind//////////////////////////////
  // Create a sockaddr_in object and set its values.
  sockaddr_in service;
  
  // AF_INET is the Internet address family.
  service.sin_family = AF_INET;
  // "127.0.0.1" is the local IP address to which the socket will be bound.
  service.sin_addr.s_addr = htons(INADDR_ANY);//inet_addr("127.0.0.1");//htons(INADDR_ANY); //inet_addr("192.168.1.2");
  // 55555 is the port number to which the socket will be bound.
  // using the htons for big-endian
  service.sin_port = htons(12345);
  
  // Call the bind function, passing the created socket and the sockaddr_in structure as parameters.
  // Check for general errors.
  if (bind(m_socket, (SOCKADDR*)&amp;service, sizeof(service)) == SOCKET_ERROR){
      printf("Server: bind() failed: %ld.\n", WSAGetLastError());
      closesocket(m_socket);
      //return 0;
  }else{
      printf("Server: bind() is OK!\n");
  }
  // Call the listen function, passing the created socket and the maximum number of allowed
  // connections to accept as parameters. Check for general errors.
  if (listen(m_socket, 1) == SOCKET_ERROR)
         printf("Server: listen(): Error listening on socket %ld.\n", WSAGetLastError());
  else{
      printf("Server: listen() is OK, I'm waiting for connections...\n");
  }
  
  // Create a temporary SOCKET object called AcceptSocket for accepting connections.
  SOCKET AcceptSocket;
  
  // Create a continuous loop that checks for connections requests. If a connection
  // request occurs, call the accept function to handle the request.
  printf("Server: Waiting for a client to connect...\n");
  printf("***Hint: Server is ready...run your client program...***\n");
  // Do some verification...
  while (1){
      AcceptSocket = SOCKET_ERROR;
  
        while (AcceptSocket == SOCKET_ERROR){
          AcceptSocket = accept(m_socket, NULL, NULL);
         }
     // else, accept the connection...  note: now it is wrong implementation !!!!!!!! !! !! (only 1 char)
     // When the client connection has been accepted, transfer control from the
     // temporary socket to the original socket and stop checking for new connections.
      printf("Server: Client Connected! Mammamija. \n");
      m_socket = AcceptSocket;
      char recvBuf[200]="";
      char * rc=recvBuf;
      int bytesRecv=recv(m_socket,recvBuf,64,0);
  
      if(bytesRecv==0 || bytesRecv==WSAECONNRESET){
          cout&lt;&lt;"server: connection closed.\n";
          }else{
              cout&lt;&lt;"server: recv() is OK.\n";
              if(bytesRecv&lt;0){
                  return 0;
                  }else{
                      printf("server: bytes received: %ld.\n",recvBuf);
              }
      }
  </code></pre>
  
  <p>the output from client:</p>
  
  <pre><code>PS C:\Users\Piter\documents\vs2010\projects\client_socket\debug&gt; ./client_socket.exe
  Client: WSAStartup() is OK.
  Client: socket() is OK.
  Client: connect() - Failed to connect.
  connect function failed with error: 10061
  PS C:\Users\Piter\documents\vs2010\projects\client_socket\debug&gt; ipconfig
  </code></pre>
  
  <p>I have created listening socket using netcat and powershell (not sure in a proper way):</p>
  
  <pre><code>PS C:\netcat&gt; ./nc.exe -v -l -p 12345
  listening on [any] 12345 ...
  Warning: forward host lookup failed for cf16.chello.pl: h_errno 11001: HOST_NOT
  connect to [192.168.1.2] from cf16.chello.pl [192.168.1.2] 4473: HOST_NOT_FOUND
  </code></pre>
  
  <p>the third and fourth lines are what happened when created client in another powershell by:</p>
  
  <pre><code>PS C:\netcat&gt; ./nc.exe 192.168.1.2 12345
  </code></pre>
  
  <p>ok.
  when forced netstat not to resolve but use IP given, now it connects:</p>
  
  <pre><code>PS C:\netcat&gt; ./nc.exe -n -v -l -p 12345
  listening on [any] 12345 ...
  connect to [192.168.1.2] from (UNKNOWN) [192.168.1.2] 4622
  </code></pre>
  
  <p>but my C++ still returns error 10061. there is no message in the powershell with server running - seems as my client doesn't connect at all - server says nothing, only client that there is error 10061.
  any ideas?
  please help  :D</p>