第一个简单的应用程序,客户端连接服务器端:
####################
server.c ####################
# include < stdio. h> # include < stdlib. h> # include < unistd. h> # include < errno . h> # include < string . h> # include < sys/ types. h> # include < sys/ socket . h> # include < netinet/ in. h> # include < arpa/ inet. h> # include < sys/ wait. h> # include < signal . h> # define MYPORT 3424 // the port users will be connecting to # define BACKLOG 10 // how many pending connections queue will hold void sigchld_handler( int s) { while ( waitpid( - 1, NULL , WNOHANG) > 0) ;//参考:me } int main( void ) { int sockfd, new_fd; // listen on sock_fd, new connection on new_fd struct sockaddr_in my_addr; // my address information struct sockaddr_in their_addr; // connector's address information socklen_t sin_size; struct sigaction sa; int yes= 1; if ( ( sockfd = socket ( AF_INET , SOCK_STREAM , 0) ) = = - 1) { perror ( "socket" ) ; exit ( 1) ; } if ( setsockopt ( sockfd, SOL_SOCKET, SO_REUSEADDR, & yes, sizeof ( int ) ) = = - 1) { perror ( "setsockopt" ) ; exit ( 1) ; } my_addr. sin_family = AF_INET ; // host byte order my_addr. sin_port = htons ( MYPORT) ; // short, network byte order my_addr. sin_addr. s_addr = INADDR_ANY ; // automatically fill with my IP memset ( my_addr. sin_zero, '/0' , sizeof my_addr. sin_zero) ; if ( bind ( sockfd, ( struct sockaddr * ) & my_addr, sizeof my_addr) = = - 1) { perror ( "bind" ) ; exit ( 1) ; } if ( listen ( sockfd, BACKLOG) = = - 1) { perror ( "listen" ) ; exit ( 1) ; } sa. sa_handler = sigchld_handler; // reap all dead processes sigemptyset ( & sa. sa_mask) ; sa. sa_flags = SA_RESTART; if ( sigaction ( SIGCHLD, & sa, NULL ) = = - 1) { perror ( "sigaction" ) ; exit ( 1) ; } while ( 1) { // main accept() loop sin_size = sizeof their_addr; if ( ( new_fd = accept ( sockfd, ( struct sockaddr *) & their_addr, & sin_size) ) = = - 1) { perror ( "accept" ) ; continue ; } printf ( "server: got connection from %s/n" , inet_ntoa( their_addr. sin_addr) ) ; if ( ! fork( ) ) { // this is the child process close ( sockfd) ; // child doesn't need the listener if ( send ( new_fd, "Hello,Liceven!/n" , 14, 0) = = - 1) perror ( "send" ) ; close ( new_fd) ; exit ( 0) ; } close ( new_fd) ; // parent doesn't need this } return 0; }
#####################client.c ######################
# include < stdio. h> # include < stdlib. h> # include < unistd. h> # include < errno . h> # include < string . h> # include < netdb. h> # include < sys/ types. h> # include < netinet/ in. h> # include < sys/ socket . h> # define PORT 3424 // the port client will be connecting to # define MAXDATASIZE 100 // max number of bytes we can get at once int main( int argc, char * argv[ ] ) { int sockfd, numbytes; char buf[ MAXDATASIZE] ; struct hostent * he; struct sockaddr_in their_addr; // connector'saddress information if ( argc ! = 2) { fprintf ( stderr , "usage: client hostname/n" ) ; exit ( 1) ; } if ( ( he= gethostbyname ( argv[ 1] ) ) = = NULL ) { // get the host info herror ( "gethostbyname" ) ; exit ( 1) ; } if ( ( sockfd = socket ( PF_INET , SOCK_STREAM , 0) ) = = - 1) { perror ( "socket" ) ; exit ( 1) ; } their_addr. sin_family = AF_INET ; // host byte order their_addr. sin_port = htons ( PORT) ; // short, network byte order their_addr. sin_addr = * ( ( struct in_addr * ) he- > h_addr) ; memset ( their_addr. sin_zero, '/0' , sizeof their_addr. sin_zero) ; if ( connect ( sockfd, ( struct sockaddr * ) & their_addr, sizeof their_addr) = = - 1) { perror ( "connect" ) ; exit ( 1) ; } if ( ( numbytes= recv ( sockfd, buf, MAXDATASIZE- 1, 0) ) = = - 1) { perror ( "recv" ) ; exit ( 1) ; } buf[ numbytes] = '/0' ; printf ( "Received: %s" , buf) ; close ( sockfd) ; return 0; }
linux执行:
$gcc -o server server.c
$./server
$gcc -o client client.c
$./client localhost 或者 $./client 127.0.0.1
你可以看到执行结果:
server端:server: got connection from 127.0.0.1
client端 :Received: Hello,Liceven!