Linux Socket 编程实例(一个Hello World程序)

2019-07-12 23:39发布

在Linux下写了个小的socket程序,分为客户端和服务器端,服务端开一个端口(2000),做为一个daemon,等待客户的连接请求.一旦有客户连接,服务器端打印出客户端的IP地址和端口,并且向服务器端发送欢迎信息和时间.下面是服务端的代码(tcpserver.c).由于这只是个简单的程序,所以只用了单线程实现! tcpserver.c /** * Tcp Server program, It is a simple example only. * zhengsh 200520602061 2 * when client connect to server, send a welcome message and timestamp in server. */ #include #include #include #include #include #include #include #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! " ); 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! " ,SERVER_PORT); exit( 1 ); } if (listen(servfd,LENGTH_OF_LISTEN_QUEUE) < 0 ) { printf( " call listen failure! " ); 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! " ); break ; } strcpy(buf,WELCOME_MESSAGE); // inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE); printf( " from client,IP:%s,Port:%d " , 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 ; } tcpclient.c /** * Tcp client program, It is a simple example only. * zhengsh 200520602061 2 * connect to server, and echo a message from server. */ #include #include #include #include #include #include #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. " void usage(char* name) { printf( " usage: %s IpAddr " ,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! " ); 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! " ,CLIENT_PORT); exit( 1 ); } if (connect(clifd,( struct sockaddr * ) & servaddr, socklen) < 0 ) { printf( " can't connect to %s! ", 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 : %s", argv[1], buf); close(clifd); return 0; }