Jump to content

  • Log In with Google      Sign In   
  • Create Account


WinSock connect() call appears to hang?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 chris2307   Members   -  Reputation: 163

Like
0Likes
Like

Posted 03 December 2012 - 12:04 PM

Hi All,

I am having some problems. I had a basic Server and Client app that would connect to each other. I have been doing some work to try and get the client to pass structs to the server (but that is not the issue here). I am certain I have not changed anything but for some reason, the client hangs. I have debugged to the point where it is calling the connect() function but I cannot go any deeper. Can anyone spot any problems?

Thanks

Client Code:

#include <WinSock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <string>
#pragma comment(lib, "Ws2_32.lib")
class WinSockClient
{
private:
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"
WSADATA wsaData;
SOCKET ConnectSocket;
int recvbuflen;
int exitCode;
char recvbuf[DEFAULT_BUFLEN];
struct addrinfo *result,
	 *ptr,
	 hints;
public:
WinSockClient()
{
  ConnectSocket = INVALID_SOCKET;
  addrinfo *result = NULL,
	 *ptr = NULL;
  exitCode = 0;
  recvbuflen = DEFAULT_BUFLEN;
}
int Startup()
{
  exitCode = WSAStartup(MAKEWORD(2,2), &wsaData);
  if(exitCode != 0)
  {
   printf("WSAStartup failed: %d\n", result);
   return 1;
  }
  ZeroMemory(&hints, sizeof(hints));
  hints.ai_family = AF_UNSPEC;	   //Unspecified (We can be returned IPv4 or IPv6 addresses)
  hints.ai_socktype = SOCK_STREAM;   //We're using a stream socket
  hints.ai_protocol = IPPROTO_TCP;   //We're using the TCP protocol
  exitCode = getaddrinfo("192.168.0.2", DEFAULT_PORT, &hints, &result);
  if (exitCode != 0)
  {
   printf("getaddrinfo failed: %d\n", exitCode);
   WSACleanup();
   return 1;
  }
}
int Create()
{
  ConnectSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);

  ptr=result;
  ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype,
  ptr->ai_protocol);
  /* Check that socket is valid */
  if (ConnectSocket == INVALID_SOCKET)
  {
   printf("Error at socket(): %ld\n", WSAGetLastError());
   freeaddrinfo(result);
   WSACleanup();
   return 1;
  }
}
int Connect(int timeout)
{
  /* Connect to server. The application will retry if a connection fails
  up until a maximum timeout of 60 second */
  exitCode = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
  int counter = 0;
  while (exitCode == SOCKET_ERROR)
  {
   printf("Unable to connect to server. Retrying.\n");
   counter++;
   Sleep(1000);
   exitCode = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
   if(counter == timeout)
	break;
  }
  if(exitCode == SOCKET_ERROR)
  {
   closesocket(ConnectSocket);
   ConnectSocket = INVALID_SOCKET;
   printf("Unable to connect to server!\n");
   WSACleanup();
   return 1;
  }
  /* Connection has been made - Free no longer needed resources */
  freeaddrinfo(result);
  printf("Connection made!\n");
}
int Send(playerStats stats)
{
  // Send an initial buffer
  exitCode = send(ConnectSocket, (char const *)&stats, sizeof(stats), 0); // My message is sent here (???)
  if (exitCode == SOCKET_ERROR)
  {
   printf("send failed: %d\n", WSAGetLastError());
   closesocket(ConnectSocket);
   WSACleanup();
   return 1;
  }
  printf("Test Message Sent\n");
  //printf("Bytes Sent: %ld\n", exitCode);
}
int Recieve()
{
  int returnCode = 0;
  int messages;
  do
  {
   messages = recv(ConnectSocket, recvbuf, recvbuflen, 0);
   if (messages > 0)
   {
	//printf("Bytes received: %d\n", messages);
	//printf("\n", recvbuf, "\n");
	returnCode = 0;
	messages = 0;
   }
   else if (messages == 0)
   {
	returnCode = 1;
   }
   else
   {
	printf("recv failed: %d\n", WSAGetLastError());
	returnCode = 2;
   }
  } while (messages > 0);
  return returnCode;
}
int ShutdownConnection()
{
  exitCode = shutdown(ConnectSocket, SD_SEND);
  if (exitCode == SOCKET_ERROR)
  {
   printf("shutdown failed: %d\n", WSAGetLastError());
   closesocket(ConnectSocket);
   WSACleanup();
   return 1;
  }
  return 0;
}
};

Main:

struct playerStats
{
int studentNumber;
int levelAchieved;
};
#include "WinSocketClient.h"
WinSockClient wsClient;
playerStats pStats;

int main()
{
int returnCode;

pStats.studentNumber = 542;
pStats.levelAchieved = 2;
wsClient.Startup();
wsClient.Create();
if(wsClient.Connect(60) == -1)
{
  printf("Connection attempt timedout\n");
  wsClient.ShutdownConnection();
  return 0;
}
wsClient.Send(pStats);
while(returnCode = wsClient.Recieve() == 0)
{
  Sleep(500);
  wsClient.Send(pStats);
}
if(returnCode == 1)
{
  printf("Reply not recieved\n");
}
if(returnCode == 2)
{
  printf("RECV error\n");
}
wsClient.ShutdownConnection();
system("PAUSE");
return 0;
}


Sponsor:

#2 Zaoshi Kaba   Crossbones+   -  Reputation: 4087

Like
0Likes
Like

Posted 03 December 2012 - 12:31 PM

connect() will hang while it's trying to connect, waiting long enough should return from function.
Knowing that you should ask yourself if server is turned on and bind() and listen() and accept() were successful.
It seems to be console application, Windows tends not to kill socket right away if you click X, gotta kill conhost.exe processes through Task Manager. I think there's some fix for this but I can't remember it.

#3 hplus0603   Moderators   -  Reputation: 5155

Like
0Likes
Like

Posted 03 December 2012 - 01:14 PM

Your functions (Create, Connect, etc) do not return anything in case of success, but return 1 in case of error. This is undefined behavior (and will likely return "any number that happens to be in a register" on success.)
Turning on compiler warnings will tell you about this. I suggest you turn on all compiler warnings, and you fix your code so it's warning free.

Second, what does Wireshark say if you run it, listening on the port in question, when you run the client?

enum Bool { True, False, FileNotFound };




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS