WinSock connect() call appears to hang?

Started by
1 comment, last by hplus0603 11 years, 4 months ago
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;
}
Advertisement
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.
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 };

This topic is closed to new replies.

Advertisement