HP 3000 Manuals

Source Program [ Berkeley Sockets/iX Reference Manual ] MPE/iX 5.0 Documentation


Berkeley Sockets/iX Reference Manual

Source Program 

The following program was broken into steps to show how a connection is
established between two sockets.

   1.  Establish the connection in loopback, using a single process:

            #include </stdio.h>
            #include <sys/types.h>
            #include <sys/socket.h>
            #include <sys/stat.h>
            #include <sys/in.h>
            #include <sys/errno.h>
            #include <fcntl.h>
            #include <unistd.h>

            main()
            {
               int sock;
               int peer1;
               int struc_len;
               int fret;
               int sock2;
               struct sockaddr_in sockaddr;

   2.  Create the two sockets:

            sock=socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
            if (sock == -1)
               print ("Error creating socket.\n");

            peer1 = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
            if (peer1 == -1)
               printf ("Error creating socket.\n");

   3.  Create the socket structure to bind the socket.  The IP address
       used is 0 (loopback), and the SAP is set to an arbitrary constant
       (4444).  This structure is used for both the bind and the connect:

            sockaddr.sin_family = AF_INET;
            sockaddr.sin_addr.s_addr = INADDR_THISHOST;
            sockaddr.sin_port = 4444;

            struc_len = 16;

            if (bind (sock, (struct sockaddr *) &sockaddr,
                     sizeof (sockaddr)) < 0 )
               printf ("Bind failed\n);
            listen (sock,10);

   4.  Set the socket initiating the connection to be nonblocking.  This
       allows the connect to return to the user without blocking and
       waiting for accept:

       _________________________________________________________________ 

       NOTE  The sfcntl function should be used until the fcntl is
             provided by the operating system.

       _________________________________________________________________ 

            sfcntl (peer1, F_SETFL, O_NONBLOCK);

            fret = connect (peer1, (struct sockaddr *) &sockaddr, struc_len);
            if (fret == -1)
               printf ("Connect failed with error %d\n",errno);
            else
               printf ("Connect succeeded\n");

            sock2 = accept (sock, (struct sockaddr *) &sockaddr, &struc_len);
            if (sock2 == -1)
               printf ("Accept failed\n");
            else
               printf ("Accept succeeded\n");

   5.  Call recv to complete the connection:

            recv (peer1, 0,0,0);
            }   /* end main */



MPE/iX 5.0 Documentation