Skip to main content
gamedev.net
🔒 Locked

simple network problem --solved--

Started by Penten Jun 28, 2004 at 1:19 PM 1 replies 900+ views
Original Post
Penten
Penten
I have just started learning network programming with winsock and have managed to create a simple client - server application where the client can send data to the server who then displays it. Server:
#include <winsock2.h>
#include <iostream>

#pragma comment( lib, "ws2_32.lib" )




int main()
{
	/* init winsock */
	WSADATA wsadat;
	if( WSAStartup( MAKEWORD( 2, 0 ), &wsadat ) != 0 )
	{
		std::cout<<"Error starting winsock\n";
		return 0;
	}
	else
	{
		std::cout<<"Winsock started...\n";
	}

	/* create socket */
	SOCKET homeSock;
	homeSock = socket( AF_INET, SOCK_STREAM, 0 );
	if( homeSock == INVALID_SOCKET )
	{
		WSACleanup();
		std::cout<<"Error creating socket\n";
		return 0;
	}
	else
	{
		std::cout<<"Socket created...\n";
	}

	/* bind socket */
	SOCKADDR_IN homeSockAddr;
	homeSockAddr.sin_port = htons(50);
	homeSockAddr.sin_family = AF_INET;
	homeSockAddr.sin_addr.S_un.S_addr = INADDR_ANY;

	if( bind( homeSock, (SOCKADDR*)&homeSockAddr, sizeof(homeSockAddr) ) == SOCKET_ERROR )
	{
		WSACleanup();
		std::cout<<"Error binding socket\n";
		return 0;
	}
	else
	{
		std::cout<<"Socket bound...\n";
	}

	/* listen */
	listen( homeSock, 1 );

	/* accept a connection */
	SOCKET tempSock = SOCKET_ERROR;
	while( tempSock == SOCKET_ERROR )
	{
		tempSock = accept( homeSock, NULL, NULL );
	}
	homeSock = tempSock;
	std::cout<<"Connection accepted...\n";

	/* wait for data to recieve */
	int val = SOCKET_ERROR; 
	char data[101];

	while( 1 )
	{
		while( val == SOCKET_ERROR )
		{
			val = recv( homeSock, data, sizeof(data), 0 );

			if ( ( val == 0) || ( val == WSAECONNRESET ) || ( val == WSAECONNABORTED ) )
			{
				std::cout<<"Client closed connection\n";
				return 0;
			}
		}
		if( data[0] == '$' )
		{
			std::cout<<"Client quit, quitting\n";
			break;
		}
		else
		{
		std::cout<<"Data recieved: "<<data<<std::endl;
		val = SOCKET_ERROR;
		}
	}

	std::cout<<"Shutting down server\n";
	std::cin.get();					
	/* shutdown */
	shutdown ( homeSock, SD_BOTH ); 
	closesocket( homeSock ); //close socket
	WSACleanup();


	return 1;
}
and Client:
#include <winsock2.h>
#include <iostream>

#pragma comment( lib, "ws2_32.lib" )




int main()
{
	
	char IP[15];
	memset( IP, '\0', 15 );
	/* init winsock */
	WSADATA wsadat;
	if( WSAStartup( MAKEWORD( 2, 0 ), &wsadat ) != 0 )
	{
		std::cout<<"Error starting winsock\n";
		return 0;
	}
	else
	{
		std::cout<<"Winsock started...\n";
	}

	/* create socket */
	SOCKET homeSock;
	homeSock = socket( AF_INET, SOCK_STREAM, 0 );
	if( homeSock == INVALID_SOCKET )
	{
		WSACleanup();
		std::cout<<"Error creating socket\n";
		return 0;
	}
	else
	{
		std::cout<<"Socket created...\n";
	}
	
	/* connect */
	SOCKADDR_IN sockAddr;
	sockAddr.sin_port = htons(50);
	sockAddr.sin_family = AF_INET;
	/*sockAddr.sin_addr.S_un.S_un_b.s_b1 = b1;
	sockAddr.sin_addr.S_un.S_un_b.s_b2 = b2;
	sockAddr.sin_addr.S_un.S_un_b.s_b3 = b3;
	sockAddr.sin_addr.S_un.S_un_b.s_b4 = b4;*/

	std::cout<<"Please enter IP here: \n>";
	std::cin>>IP;

	sockAddr.sin_addr.s_addr = inet_addr( IP );

	if( connect( homeSock, (SOCKADDR*)&sockAddr, sizeof(sockAddr)) != 0 )
	{
		WSACleanup();
		std::cout<<"Error connecting\n";
		return 0;
	}
	else
	{
		std::cout<<"Connected!\n";
	}

	/* send data */
	char data[101];
	data[0] = '\0';
	int bytesSent = 0;

	std::cout<<"Please enter data to send here :"<<std::endl;

	while( data[0] != '$' )
	{
		std::cout<<">";
		std::cin.getline( data, 100, '\n' );

		bytesSent = send( homeSock, data, sizeof(data), 0 );
		if( bytesSent == 0 )
		{
			std::cout<<"Error, no data sent";
		}
	}



	std::cout<<"Quitting\n";
	std::cin.get(); // to keep windows open

	/* shutdown */
	shutdown ( homeSock, SD_BOTH ); 
	closesocket( homeSock ); //close socket
	WSACleanup();

	return 1;
}
When I connect to 127.0.0.1 it works fine but when I try to connect to another computer it cannot connect. I wondered if this is because I have two computers using the same modem and who have the same IP. Thnaks for your help. [edit] console application in Visual C++ .net [/edit] [Edited by - Penten on June 28, 2004 1:59:21 PM]
JonStelly
JonStelly
The two computers don't (or shouldn't) have the same IP. I'm assuming you only have 1 public internet IP, which means you'll probably be running some sort of Network Address Translation somewhere. Assuming that's the case, you'll have 1 public IP address, and as many private IP addresses as you have computers / devices.

Go to your server machine, open a command prompt, run "ipconfig" and find the address that looks like 192.168.*.* or 10.*.*.*. Use that as the IP address you try to connect to from the client.
Penten
Penten
...I feel very stupid now :)
I was (stupidly) using and internet site to give me my IP...
Thankyou..thankyou!!! :)

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.