客戶端:
#include <stdio.h> #include <sys/socket.h> #include <unistd.h> #include <sys/types.h> #include <netinet/in.h> #include <stdlib.h> #define SERVER_PORT 20000 // define the defualt connect port id #define CLIENT_PORT ((20001+rand())%65536) // define the defualt client port as a random port #define BUFFER_SIZE 255 #define REUQEST_MESSAGE "welcome to connect the server.\n" void usage(char* name) { printf( " usage: %s IpAddr\n " ,name); } int main(int argc, char** argv) { int servfd,clifd,length = 0; struct sockaddr_in servaddr,cliaddr; socklen_t socklen = sizeof (servaddr); char buf[BUFFER_SIZE]; if (argc < 2 ) { usage(argv[ 0 ]); exit( 1 ); } if ((clifd = socket(AF_INET,SOCK_STREAM, 0 )) < 0 ) { printf( " create socket error!\n " ); exit( 1 ); } srand(time(NULL)); // initialize random generator bzero( & cliaddr, sizeof (cliaddr)); cliaddr.sin_family = AF_INET; cliaddr.sin_port = htons(CLIENT_PORT); cliaddr.sin_addr.s_addr = htons(INADDR_ANY); bzero( & servaddr, sizeof (servaddr)); servaddr.sin_family = AF_INET; inet_aton(argv[ 1 ], & servaddr.sin_addr); servaddr.sin_port = htons(SERVER_PORT); // servaddr.sin_addr.s_addr = htons(INADDR_ANY); if (bind(clifd, (struct sockaddr* ) &cliaddr, sizeof (cliaddr)) < 0 ) { printf( " bind to port %d failure!\n " ,CLIENT_PORT); exit( 1 ); } if (connect(clifd,( struct sockaddr * ) & servaddr, socklen) < 0 ) { printf( " can't connect to %s!\n ", argv[ 1 ]); exit( 1 ); } length = recv(clifd, buf, BUFFER_SIZE, 0); if (length < 0) { printf( " error comes when recieve data from server %s! ", argv[1] ); exit( 1 ); } printf( " from server %s :\n\t%s", argv[1], buf); close(clifd); return 0; }
服務器端:
#include <stdio.h> #include <sys/socket.h> #include <unistd.h> #include <sys/types.h> #include <netinet/in.h> #include <stdlib.h> #include <time.h> #define SERVER_PORT 20000 // define the defualt connect port id #define LENGTH_OF_LISTEN_QUEUE 10 // length of listen queue in server #define BUFFER_SIZE 255 #define WELCOME_MESSAGE "welcome to connect the server. " int main(int argc, char** argv) { int servfd,clifd; struct sockaddr_in servaddr,cliaddr; if ((servfd = socket(AF_INET,SOCK_STREAM, 0 )) < 0 ) { printf( " create socket error!\n " ); exit( 1 ); } bzero( & servaddr, sizeof (servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERVER_PORT); servaddr.sin_addr.s_addr = htons(INADDR_ANY); if (bind(servfd,( struct sockaddr * ) & servaddr, sizeof (servaddr)) < 0 ) { printf( " bind to port %d failure!\n " ,SERVER_PORT); exit( 1 ); } if (listen(servfd,LENGTH_OF_LISTEN_QUEUE) < 0 ) { printf( " call listen failure!\n " ); exit( 1 ); } while ( 1 ) { // server loop will nerver exit unless any body kill the process char buf[BUFFER_SIZE]; long timestamp; socklen_t length = sizeof (cliaddr); clifd = accept(servfd,( struct sockaddr * ) & cliaddr, & length); if (clifd < 0 ) { printf( " error comes when call accept!\n " ); break ; } strcpy(buf,WELCOME_MESSAGE); // inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE); printf( " from client,IP:%s,Port:%d\n " ,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port)); timestamp = time(NULL); strcat(buf, " timestamp in server: " ); strcat(buf,ctime( & timestamp)); send(clifd,buf,BUFFER_SIZE, 0 ); close(clifd); } // exit close(servfd); return 0 ; }