www.pudn.com > MSTCPSDK.rar > SERVER.C
/* COPYRIGHT, (c) HEWLETT PACKARD CO. 1990,1991 */ /* All rights reserved. No part of this program */ /* may be copied or used without the express */ /* written consent of HEWLETT PACKARD Corp. */ #include#include #include #include #include #define BUFFER_SIZE 1000 char sendbuf[BUFFER_SIZE]; char recvbuf[BUFFER_SIZE]; struct sockaddr_in server_addr, client_addr; int sleep( seconds ) int seconds; { long start_seconds, current_seconds, end_seconds; time( &start_seconds ); end_seconds = start_seconds + (long) seconds; do { time( ¤t_seconds ); } while ( current_seconds < end_seconds ); return( 0 ); } /* ** This short program will act as a network 'server' and will accept a ** single incoming connection. After the connection is established, data ** will be received and then transmitted, and the server terminates */ int errno; main( argc, argv ) int argc; char *argv[]; { int rc, i, len, total, listen_sd, acc_sd; unsigned int size; if ( argc < 3 ) { printf( "Usage: %s \n", argv[0] ); exit( 1 ); } size = atoi( argv[2] ); /* ** Create a socket locally to serve as a communication endpoint. */ listen_sd = socket( AF_INET, SOCK_STREAM, 0 ); if ( listen_sd < 0 ) { printf( "Error: socket() call failed with errno=%d\n", errno ); exit( 1 ); } printf( "socket() returned %d\n", listen_sd ); /* ** 'Bind' the newly created socket to a wildcard local IP address and ** the local TCP port specified on the command line */ server_addr.sin_family = AF_INET; server_addr.sin_port = htons( atoi( argv[1] ) ); server_addr.sin_addr.s_addr = INADDR_ANY; rc = bind( listen_sd, (struct sockaddr *) &server_addr, sizeof( server_addr ) ); if ( rc < 0 ) { printf( "Error: bind() call failed w/errno=%d\n", errno ); close_socket( listen_sd ); exit( 1 ); } printf( "bind() call returned %d\n", rc ); /* ** Create a queue of length one to hold incoming connection requests. */ printf( "server will listen on port %d\n", ntohs( server_addr.sin_port ) ); rc = listen( listen_sd, 1 ); if ( rc < 0 ) { printf( "Error: listen() call failed w/errno=%d\n", errno ); close_socket( listen_sd ); exit( 1 ); } printf( "listen() call returned %d\n", rc ); /* ** Call accept(), which will block until an incoming connection is ** established on the listening socket. Accept() then returns the socket ** descriptor of the new socket and will also fill in the 'client_addr' ** socket address structure with the remote IP address and port. */ len = sizeof( struct sockaddr_in ); printf( "blocking on accept() waiting for an incoming connection...\n" ); acc_sd = accept( listen_sd, (struct sockaddr *) &client_addr, &len ); if ( acc_sd < 0 ) { printf( "Error: accept() call failed w/errno=%d\n", errno ); close_socket( listen_sd ); exit( 1 ); } printf( "Established connection with 0x%lx\n", client_addr.sin_addr ); /* ** The connection is now established. ** ** We will receive all of the data sent by the remote node before sending ** data out. There is one caveat, however. The recv() call is defined ** such that it returns as soon as ANY data is available rather than ** waiting until all 'size' bytes of data havebeen read. Therefore, we ** must loop on the recv() call until all data has been received. */ total = 0; printf( "Now attempting to receive data...\n" ); do { len = recv( acc_sd, &recvbuf[total], size-total, 0 ); if ( len < 0 ) { printf( "Error: recv() call failed w/errno=%d\n", errno ); close_socket( listen_sd ); close_socket( acc_sd ); exit( 1 ); } printf( "recv() returned %d bytes\n", len ); total += len; } while ( total < size ); /* ** Echo the received data back to the remote node. */ len = send( acc_sd, recvbuf, size, 0 ); if ( len < 0 ) { printf( "Error: recv() call failed w/errno=%d\n", errno ); close_socket( listen_sd ); close_socket( acc_sd ); exit( 1 ); } /* ** All data has been received and transmitted, so close the sockets. */ close_socket( acc_sd ); close_socket( listen_sd ); exit( 0 ); }