a problem with sockets

moi%brandeis.csnet at CSNET-RELAY.arpa moi%brandeis.csnet at CSNET-RELAY.arpa
Sun Jul 20 07:06:50 AEST 1986


	I was interested in writing a server that would collect messages
	from processes running on several machines connected via
	Ethernet.  I wrote both the server and a simple client process
	that would attemp to send a message to the server.  The problem
	I've been unable to solve is this: when both the server and the
	client are on the same machine, the client is able to reach the
	server and send its message.  When the client is on a different
	machine from the server, the client call to "connect()" fails
	with a "connection refused" error.  I tried running both
	processes with root privileges (in case there was some protection
	problem I wasn't aware of), and I checked the "/etc/hosts" file
	to make sure each machine knew about the other.  Any ideas?
	
	Our network consists of 2 VAX 780s running UNIX 4.2BSD and 4
	SUNs running SUN UNIX 3.0.  I should mention that the problem
	seems to occur only when one of the machines is a SUN and the
	other a VAX; when both processes are on VAXes only, or on SUNs
	only, they work just fine.

	Any help would be greatly appreciated.

					Moises Lejter
					CSnet: moi%brandeis at csnet-relay

P.S.	The two programs I wrote are:

----- server -----

/*
 * server:
 */

#include <sys/types.h>
#include <sys/file.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <sys/errno.h>

#define MAX_QUEUE_SIZE	5		/* max # entries in socket queue*/
#define MAX_HOST_NAME	16		/* max # chars in host name	*/

#define INET_PORT	2052		/* internet port number		*/
#define ERROR		-1		/* return value on error	*/
#define LOOP		while (1)	/* loop forever			*/
#define BUFFER_SIZE	1024		/* Internet buffer size		*/


char host[ MAX_HOST_NAME ];		/* host name			*/
struct sockaddr_in inet_host;		/* Internet address of host	*/
struct sockaddr_in client;		/* Internet address of client	*/
struct hostent *host_data;		/* network data on host		*/
int server_socket;			/* server listener socket	*/
int conn_socket;			/* server connection socket	*/
int errno;				/* global system error code	*/
char buffer[ BUFFER_SIZE ];		/* i/o buffer			*/


void sys_error( msg )
    char *msg;
    {
	perror( msg );
	exit( -1 );
    }


void accept_client()
    {
	int client_size = sizeof( client );
	struct hostent *client_name;

	conn_socket = accept( server_socket, & client,
			      & client_size );
	if (conn_socket < 0) sys_error("server: accept");
	read( conn_socket, buffer, sizeof( buffer ));
	printf( "server: read: %s\n", buffer );
	close( conn_socket );
    }


main( argc, argv )
    int argc;
    char *argv[];
    {
	gethostname( host, MAX_HOST_NAME );
	host_data = gethostbyname( host );
	bzero( & inet_host, sizeof( inet_host ));
	bcopy( host_data->h_addr, &inet_host.sin_addr, host_data->h_length );
	inet_host.sin_family = AF_INET;
	inet_host.sin_port = INET_PORT;

	if ((server_socket = socket( AF_INET, SOCK_STREAM, 0 )) < 0)
	    sys_error( "server: socket" );
	else if (bind( server_socket, & inet_host, sizeof( inet_host )) < 0)
	    sys_error( "server: bind" );
	else if (listen( server_socket, MAX_QUEUE_SIZE ) < 0)
	    sys_error( "server: listen" );

	LOOP accept_client();
    }

-----end of server-----
-----client-----
/*
 * client process
 */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define INET_PORT	2052		/* internet port number		*/

struct sockaddr_in inet_name;		/* Internet address of host	*/
struct hostent *remote_host;		/* info about remote host	*/
int connection;				/* communications socket	*/

void sys_error( msg )
    char *msg;
    {
	perror( msg );
	exit( -1 );
    }


main( argc, argv )
    int argc;
    char *argv[];
    {
	remote_host = gethostbyname( argv[ 1 ] );
	bzero( & inet_name, sizeof( inet_name ));
	bcopy( remote_host->h_addr, & inet_name.sin_addr,
	       remote_host->h_length );
	inet_name.sin_family = remote_host->h_addrtype;
	inet_name.sin_port = INET_PORT;

	connection = socket( AF_INET, SOCK_STREAM, 0 );
	if (connect( connection, & inet_name, sizeof( inet_name )) < 0)
	    sys_error( "client: connect" );
	else {
		write( connection, "hello there", 12 );
		shutdown( connection );
		close( connection );
	}
    }
-----end of client-----



More information about the Comp.unix.wizards mailing list