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

在Linux下写了个小的socket程序,分为客户端和服务器端,服务端开一个端口(2000),做为一个daemon,等待客户的连接请求.一旦有客户连接,服务器端打印出客户端的IP地址和端口,并且向服务器端发送欢迎信息和时间.下面是服务端的代码(tcpserver.c).由于这只是个简单的程序,所以只用了单线程实现!

Linux Socket编程实例(一个Hello World程序)/* *
Linux Socket编程实例(一个Hello World程序) * Tcp Server program, It is a simple example only.
Linux Socket编程实例(一个Hello World程序) * zhengsh 200520602061 2
Linux Socket编程实例(一个Hello World程序) * when client connect to server, send a welcome message and timestamp in server.
Linux Socket编程实例(一个Hello World程序)  
*/
 
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)#include  <stdio.h> 
Linux Socket编程实例(一个Hello World程序)#include  <sys/socket.h> 
Linux Socket编程实例(一个Hello World程序)#include  <unistd.h> 
Linux Socket编程实例(一个Hello World程序)#include  <sys/types.h> 
Linux Socket编程实例(一个Hello World程序)#include  <netinet/in.h> 
Linux Socket编程实例(一个Hello World程序)#include  <stdlib.h> 
Linux Socket编程实例(一个Hello World程序)#include  <time.h> 
Linux Socket编程实例(一个Hello World程序) 
Linux Socket编程实例(一个Hello World程序)#define  SERVER_PORT 20000  //  define the defualt connect port id 
Linux Socket编程实例(一个Hello World程序)#define  LENGTH_OF_LISTEN_QUEUE 10  // length of listen queue in server 
Linux Socket编程实例(一个Hello World程序)#define  BUFFER_SIZE 255 
Linux Socket编程实例(一个Hello World程序)#define  WELCOME_MESSAGE "welcome to connect the server. " 
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)int main(int argc, char** argv)
Linux Socket编程实例(一个Hello World程序){
Linux Socket编程实例(一个Hello World程序)       int  servfd,clifd;
Linux Socket编程实例(一个Hello World程序)       struct  sockaddr_in servaddr,cliaddr;
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)       if  ((servfd  =  socket(AF_INET,SOCK_STREAM, 0 ))  <   0 )
Linux Socket编程实例(一个Hello World程序)         {
Linux Socket编程实例(一个Hello World程序)              printf( " create socket error!\n " );
Linux Socket编程实例(一个Hello World程序)              exit( 1 );
Linux Socket编程实例(一个Hello World程序)       }
 
Linux Socket编程实例(一个Hello World程序) 
Linux Socket编程实例(一个Hello World程序)       bzero( & servaddr, sizeof (servaddr));
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)       servaddr.sin_family  =  AF_INET;
Linux Socket编程实例(一个Hello World程序)       servaddr.sin_port  =  htons(SERVER_PORT);
Linux Socket编程实例(一个Hello World程序)       servaddr.sin_addr.s_addr  =  htons(INADDR_ANY);
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)       if  (bind(servfd,( struct  sockaddr * ) & servaddr, sizeof (servaddr)) < 0 )
Linux Socket编程实例(一个Hello World程序)         {
Linux Socket编程实例(一个Hello World程序)              printf( " bind to port %d failure!\n " ,SERVER_PORT);
Linux Socket编程实例(一个Hello World程序)              exit( 1 );
Linux Socket编程实例(一个Hello World程序)       }
 
Linux Socket编程实例(一个Hello World程序) 
Linux Socket编程实例(一个Hello World程序)        if  (listen(servfd,LENGTH_OF_LISTEN_QUEUE)  <   0 )
Linux Socket编程实例(一个Hello World程序)         {
Linux Socket编程实例(一个Hello World程序)              printf( " call listen failure!\n " );
Linux Socket编程实例(一个Hello World程序)              exit( 1 );
Linux Socket编程实例(一个Hello World程序)       }
 
Linux Socket编程实例(一个Hello World程序) 
Linux Socket编程实例(一个Hello World程序)        while  ( 1 )
Linux Socket编程实例(一个Hello World程序)         // server loop will nerver exit unless any body kill the process 
Linux Socket编程实例(一个Hello World程序)

Linux Socket编程实例(一个Hello World程序)              char  buf[BUFFER_SIZE];
Linux Socket编程实例(一个Hello World程序)              long  timestamp;
Linux Socket编程实例(一个Hello World程序)              socklen_t length  =   sizeof (cliaddr);
Linux Socket编程实例(一个Hello World程序)              clifd  =  accept(servfd,( struct  sockaddr * ) & cliaddr, & length);
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)               if  (clifd  <   0 )
Linux Socket编程实例(一个Hello World程序)                {
Linux Socket编程实例(一个Hello World程序)                     printf( " error comes when call accept!\n " );
Linux Socket编程实例(一个Hello World程序)                     break ;
Linux Socket编程实例(一个Hello World程序)              }
 
Linux Socket编程实例(一个Hello World程序) 
Linux Socket编程实例(一个Hello World程序)              strcpy(buf,WELCOME_MESSAGE);
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)               // inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE); 
Linux Socket编程实例(一个Hello World程序)

Linux Socket编程实例(一个Hello World程序)              printf( " from client,IP:%s,Port:%d\n " ,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)              timestamp  =  time(NULL);
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)              strcat(buf, " timestamp in server: " );
Linux Socket编程实例(一个Hello World程序)              strcat(buf,ctime( & timestamp));
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)              send(clifd,buf,BUFFER_SIZE, 0 );
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)              close(clifd);           
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)       }
 // exit 
Linux Socket编程实例(一个Hello World程序)
 
Linux Socket编程实例(一个Hello World程序)       close(servfd);
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)        return   0 ;
Linux Socket编程实例(一个Hello World程序)}


 客户每次用一个随机的端口连接服务器,并接收来自服务器的欢迎信息,然后打印出来(tcpclient).运行的时候接受一个参数,也就是服务器的ip地址.
Linux Socket编程实例(一个Hello World程序)/*  Tcp client program, It is a simple example only.
Linux Socket编程实例(一个Hello World程序) * zhengsh 200520602061 2
Linux Socket编程实例(一个Hello World程序) * connect to server, and echo a message from server.
Linux Socket编程实例(一个Hello World程序)
*/
 
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)#include <stdio.h>
Linux Socket编程实例(一个Hello World程序)#include <sys/socket.h>
Linux Socket编程实例(一个Hello World程序)#include <unistd.h>
Linux Socket编程实例(一个Hello World程序)#include <sys/types.h>
Linux Socket编程实例(一个Hello World程序)#include <netinet/in.h>
Linux Socket编程实例(一个Hello World程序)#include <stdlib.h> 
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)#define  SERVER_PORT 20000  //  define the defualt connect port id 
Linux Socket编程实例(一个Hello World程序)#define  CLIENT_PORT ((20001+rand())%65536)  //  define the defualt client port as a random port 
Linux Socket编程实例(一个Hello World程序)#define  BUFFER_SIZE 255 
Linux Socket编程实例(一个Hello World程序)#define  REUQEST_MESSAGE "welcome to connect the server.\n" 
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)void  usage(char* name)
Linux Socket编程实例(一个Hello World程序){
Linux Socket编程实例(一个Hello World程序)       printf( " usage: %s IpAddr\n " ,name);
Linux Socket编程实例(一个Hello World程序)}

Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)int  main(int argc, char** argv)
Linux Socket编程实例(一个Hello World程序){
Linux Socket编程实例(一个Hello World程序)       int  servfd,clifd,length = 0;
Linux Socket编程实例(一个Hello World程序)       struct  sockaddr_in servaddr,cliaddr;
Linux Socket编程实例(一个Hello World程序)       socklen_t socklen  =   sizeof (servaddr);
Linux Socket编程实例(一个Hello World程序)       char  buf[BUFFER_SIZE];
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)        if (argc < 2 )
Linux Socket编程实例(一个Hello World程序)         {
Linux Socket编程实例(一个Hello World程序)              usage(argv[ 0 ]);
Linux Socket编程实例(一个Hello World程序)              exit( 1 );
Linux Socket编程实例(一个Hello World程序)       }
 
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)       if ((clifd  =  socket(AF_INET,SOCK_STREAM, 0 ))  <   0 )
Linux Socket编程实例(一个Hello World程序)         {
Linux Socket编程实例(一个Hello World程序)             printf( " create socket error!\n " );
Linux Socket编程实例(一个Hello World程序)             exit( 1 );
Linux Socket编程实例(一个Hello World程序)       }
 
Linux Socket编程实例(一个Hello World程序) 
Linux Socket编程实例(一个Hello World程序)       srand(time(NULL)); // initialize random generator 
Linux Socket编程实例(一个Hello World程序)
 
Linux Socket编程实例(一个Hello World程序)       bzero( & cliaddr, sizeof (cliaddr));
Linux Socket编程实例(一个Hello World程序)       cliaddr.sin_family  =  AF_INET;
Linux Socket编程实例(一个Hello World程序)       cliaddr.sin_port  =  htons(CLIENT_PORT);
Linux Socket编程实例(一个Hello World程序)       cliaddr.sin_addr.s_addr  =  htons(INADDR_ANY);
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)       bzero( & servaddr, sizeof (servaddr));
Linux Socket编程实例(一个Hello World程序)       servaddr.sin_family  =  AF_INET;
Linux Socket编程实例(一个Hello World程序)       inet_aton(argv[ 1 ], & servaddr.sin_addr);
Linux Socket编程实例(一个Hello World程序)       servaddr.sin_port  =  htons(SERVER_PORT);
Linux Socket编程实例(一个Hello World程序)      // servaddr.sin_addr.s_addr = htons(INADDR_ANY); 
Linux Socket编程实例(一个Hello World程序)

Linux Socket编程实例(一个Hello World程序)       if  (bind(clifd, (struct sockaddr* ) &cliaddr, sizeof (cliaddr)) < 0 )
Linux Socket编程实例(一个Hello World程序)       {
Linux Socket编程实例(一个Hello World程序)              printf( " bind to port %d failure!\n " ,CLIENT_PORT);
Linux Socket编程实例(一个Hello World程序)              exit( 1 );
Linux Socket编程实例(一个Hello World程序)       }
 
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)        if (connect(clifd,( struct  sockaddr * ) & servaddr, socklen)  <   0 )
Linux Socket编程实例(一个Hello World程序)       {
Linux Socket编程实例(一个Hello World程序)              printf( " can't connect to %s!\n ", argv[ 1 ]);
Linux Socket编程实例(一个Hello World程序)              exit( 1 );
Linux Socket编程实例(一个Hello World程序)       }
 
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)       length  =  recv(clifd, buf, BUFFER_SIZE, 0);
Linux Socket编程实例(一个Hello World程序)        if  (length < 0)
Linux Socket编程实例(一个Hello World程序)        {
Linux Socket编程实例(一个Hello World程序)              printf( " error comes when recieve data from server %s! ", argv[1] );
Linux Socket编程实例(一个Hello World程序)              exit( 1 );
Linux Socket编程实例(一个Hello World程序)       }
 
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)       printf( " from server %s :\n\t%s", argv[1], buf);
Linux Socket编程实例(一个Hello World程序)
Linux Socket编程实例(一个Hello World程序)       close(clifd);
Linux Socket编程实例(一个Hello World程序)       return 0;
Linux Socket编程实例(一个Hello World程序)}
 
Linux Socket编程实例(一个Hello World程序)



程序在Fedora core 4下通过编译,有几个warining.但是不影响.
上一篇:liunx中文件权限setuid,setgid作用及设置方法


下一篇:Swift语言与Objective-C语言混合编程