954,500 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Establishing A connection between Three programs.

Hello Everyone,

I'm trying to exchange messages between three different programs, I was able to establish a connection between the Server and Client A programs, but when I added code to include client B program I got an infinite loop. I've enclosed segments of my code. I would really appreciate any help I can get.

Thanks in advance.


Server(Passive connection):
=====================
WSADATA WsaDat;
SOCKET Socket;
SOCKET TempSock = SOCKET_ERROR;
int portnum = 50;
char String[50];
int retval = SOCKET_ERROR;
SOCKADDR_IN SockAddr;
HOSTENT *hp;
char ServerName[255];

if (WSAStartup(MAKEWORD(1, 1), &WsaDat) != 0)
{
cout <<"\n WSA Initialization Failed";
cout.flush();
}

// Clear the Address
memset(&SockAddr, 0, sizeof(SOCKADDR_IN));

// Get Local Computer Name
gethostname(ServerName, sizeof(ServerName));

// Get Local Computer Address Information
hp = gethostbyname(ServerName);
if ( hp == NULL)
{
cout <<"\n Attempt to retreive computer infromation failed";
cout.flush();
return INVALID_SOCKET;
}

// This is the host address
SockAddr.sin_family = hp->h_addrtype;

// This is the port number
SockAddr.sin_port = htons(portnum);

// Create the Socket
Socket = socket(AF_INET, SOCK_STREAM, 0);
if (Socket == INVALID_SOCKET)
{
cout <<"\n Socket Creation Failed";
cout.flush();
return INVALID_SOCKET;
}


// Binding the Address
if (bind(Socket, (SOCKADDR *)(&SockAddr), sizeof(SockAddr)) == SOCKET_ERROR)
{
cout <<"\n Attempt to bind failed";
cout.flush();
return INVALID_SOCKET;
}

// Listen to Incoming Requests and Return a Valid Socket

listen(Socket, 40);

// Accepting Incoming Requests

while (TempSock == SOCKET_ERROR)
{
TempSock =accept(Socket, NULL, NULL);
}
Socket = TempSock;

// Message exchange with Client A comes here

closesocket(TempSock);
closesocket(Socket);
==========================================================
Client A (Active connection):
======================
// ------- Initializing WSA --------
InitializingWSA(WsaDat);


// ------- Store Information About the Server -----
hostEntry = gethostbyname("station-1");

if(!hostEntry)
{
cout <<"\nError getting the host name";
cout.flush();
WSACleanup();
}


// ------- Create the Socket --------

Socket = socket(AF_INET, SOCK_STREAM, 0);
if (Socket == INVALID_SOCKET)
{
cout <<"\n Socket Creation Failed";
cout.flush();
}


// ------- Binding the Socket --------
// I want an internet type connection (TCP/IP)
ServerInfo.sin_family = AF_INET;
ServerInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);
// I want to use port 50
ServerInfo.sin_port = htons(50);


// Connect to the server
if (connect(Socket, (SOCKADDR *)(&ServerInfo), sizeof(ServerInfo)) != 0)
{
cout <<"\n Failed to Establish Connection with the Server";
cout.flush();
}

// Message exchange with the SERVER takes place here

// Close the Connection on the Client side

closesocket(Socket);

// Attempt to connect to client B
// ------- Initializing WSA ------
InitializingWSA(WsaDat);


// ------- Store Information About the Server -----
hostEntry2 = gethostbyname("station-1");

if(!hostEntry2)
{
cout <<"\nError getting the host name";
cout.flush();
WSACleanup();
}


// ------- Create the Socket --------

Socket2 = socket(AF_INET, SOCK_STREAM, 0);
if (Socket2 == INVALID_SOCKET)
{
cout <<"\n Socket 2 Creation Failed";
cout.flush();
}


// ------- Binding the Socket --------
// I want an internet type connection (TCP/IP)
ClientBInfo.sin_family = AF_INET;
ClientBInfo.sin_addr = *((LPIN_ADDR)*hostEntry2->h_addr_list);
// I want to use port 60
ClientBInfo.sin_port = htons(60);
if (connect(Socket, (SOCKADDR *)(&ClientBInfo), sizeof(ClientBInfo)) != 0)
{
cout <<"\n Failed to Establish Connection with the Client B";
cout.flush();
}

retval= SOCKET_ERROR;
char String22[50] = "Hello";
cout <<"\n String is:"<< String22 << endl;
cout.flush();

while (retval == SOCKET_ERROR)
{
retval = send(Socket2, String22, strlen(String22) +1,0);
if ( retval == 0)
{
cout <<"\n Connection closed at other end\n";
cout.flush();
break;
}
}


closesocket(Socket2);
==========================================================
Client B(Passive Connection):
======================
if (WSAStartup(MAKEWORD(1, 1), &WsaDat) != 0)
{
cout <<"\n WSA Initialization Failed";
cout.flush();
}
// Clear the Address
memset(&SockAddr, 0, sizeof(SOCKADDR_IN));

// Get Local Computer Name
gethostname(ClientBname, sizeof(ClientBname));

// Get Local Computer Address Information
hp = gethostbyname(ClientBname);
if ( hp == NULL)
{
cout <<"\n Attempt to retreive computer infromation failed";
cout.flush();
return INVALID_SOCKET;
}

// This is the host address
SockAddr.sin_family = hp->h_addrtype;

// This is the port number
SockAddr.sin_port = htons(60);

// Create the Socket
Socket = socket(AF_INET, SOCK_STREAM, 0);
if (Socket== INVALID_SOCKET)
{
cout <<"\n Socket Creation Failed";
cout.flush();
return INVALID_SOCKET;
}


// Binding the Address
if (bind(Socket, (SOCKADDR *)(&SockAddr), sizeof(SockAddr)) == SOCKET_ERROR)
{
cout <<"\n Attempt to bind failed";
cout.flush();
return INVALID_SOCKET;
}

// Listen to Incoming Requests and Return a Valid Socket

listen(Socket 40);

// Accepting Incoming Requests

while (TempSock == SOCKET_ERROR)
{
TempSock =accept(Socket, NULL, NULL);
}
Socket = TempSock;


retval= SOCKET_ERROR;

while (retval == SOCKET_ERROR)
{
retval = recv(Socket, String, 50,0);
if (retval == 0)
{
cout <<"\n Connection closed at other end";
cout.flush();
break;
}

}

cout << "\n Contents of the message:" << String << endl;
cout.flush();
// Close the Connection on the Server side
closesocket(TempSock);
closesocket(Socket);

Layla_2401
Newbie Poster
22 posts since Sep 2004
Reputation Points: 11
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You