天天看點

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程式)
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程式)
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程式)
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程式)
Linux Socket程式設計執行個體(一個Hello World程式)

#define  CLIENT_PORT ((20001+rand())%65536)  //  define the defualt client port as a random port 

Linux Socket程式設計執行個體(一個Hello World程式)
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程式)
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程式)
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程式)
Linux Socket程式設計執行個體(一個Hello World程式)
Linux Socket程式設計執行個體(一個Hello World程式)

       inet_aton(argv[ 1 ], & servaddr.sin_addr);

Linux Socket程式設計執行個體(一個Hello World程式)
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程式)
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程式)
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程式)
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.但是不影響.

繼續閱讀