歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 一步一步學Linux C:Socket實例

一步一步學Linux C:Socket實例

日期:2017/3/1 10:26:06   编辑:Linux編程

客戶端:

  1. #include <stdio.h>
  2. #include <sys/socket.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <netinet/in.h>
  6. #include <stdlib.h>
  7. #define SERVER_PORT 20000 // define the defualt connect port id
  8. #define CLIENT_PORT ((20001+rand())%65536) // define the defualt client port as a random port
  9. #define BUFFER_SIZE 255
  10. #define REUQEST_MESSAGE "welcome to connect the server.\n"
  11. void usage(char* name)
  12. {
  13. printf( " usage: %s IpAddr\n " ,name);
  14. }
  15. int main(int argc, char** argv)
  16. {
  17. int servfd,clifd,length = 0;
  18. struct sockaddr_in servaddr,cliaddr;
  19. socklen_t socklen = sizeof (servaddr);
  20. char buf[BUFFER_SIZE];
  21. if (argc < 2 )
  22. {
  23. usage(argv[ 0 ]);
  24. exit( 1 );
  25. }
  26. if ((clifd = socket(AF_INET,SOCK_STREAM, 0 )) < 0 )
  27. {
  28. printf( " create socket error!\n " );
  29. exit( 1 );
  30. }
  31. srand(time(NULL)); // initialize random generator
  32. bzero( & cliaddr, sizeof (cliaddr));
  33. cliaddr.sin_family = AF_INET;
  34. cliaddr.sin_port = htons(CLIENT_PORT);
  35. cliaddr.sin_addr.s_addr = htons(INADDR_ANY);
  36. bzero( & servaddr, sizeof (servaddr));
  37. servaddr.sin_family = AF_INET;
  38. inet_aton(argv[ 1 ], & servaddr.sin_addr);
  39. servaddr.sin_port = htons(SERVER_PORT);
  40. // servaddr.sin_addr.s_addr = htons(INADDR_ANY);
  41. if (bind(clifd, (struct sockaddr* ) &cliaddr, sizeof (cliaddr)) < 0 )
  42. {
  43. printf( " bind to port %d failure!\n " ,CLIENT_PORT);
  44. exit( 1 );
  45. }
  46. if (connect(clifd,( struct sockaddr * ) & servaddr, socklen) < 0 )
  47. {
  48. printf( " can't connect to %s!\n ", argv[ 1 ]);
  49. exit( 1 );
  50. }
  51. length = recv(clifd, buf, BUFFER_SIZE, 0);
  52. if (length < 0)
  53. {
  54. printf( " error comes when recieve data from server %s! ", argv[1] );
  55. exit( 1 );
  56. }
  57. printf( " from server %s :\n\t%s", argv[1], buf);
  58. close(clifd);
  59. return 0;
  60. }
服務器端:
  1. #include <stdio.h>
  2. #include <sys/socket.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <netinet/in.h>
  6. #include <stdlib.h>
  7. #include <time.h>
  8. #define SERVER_PORT 20000 // define the defualt connect port id
  9. #define LENGTH_OF_LISTEN_QUEUE 10 // length of listen queue in server
  10. #define BUFFER_SIZE 255
  11. #define WELCOME_MESSAGE "welcome to connect the server. "
  12. int main(int argc, char** argv)
  13. {
  14. int servfd,clifd;
  15. struct sockaddr_in servaddr,cliaddr;
  16. if ((servfd = socket(AF_INET,SOCK_STREAM, 0 )) < 0 )
  17. {
  18. printf( " create socket error!\n " );
  19. exit( 1 );
  20. }
  21. bzero( & servaddr, sizeof (servaddr));
  22. servaddr.sin_family = AF_INET;
  23. servaddr.sin_port = htons(SERVER_PORT);
  24. servaddr.sin_addr.s_addr = htons(INADDR_ANY);
  25. if (bind(servfd,( struct sockaddr * ) & servaddr, sizeof (servaddr)) < 0 )
  26. {
  27. printf( " bind to port %d failure!\n " ,SERVER_PORT);
  28. exit( 1 );
  29. }
  30. if (listen(servfd,LENGTH_OF_LISTEN_QUEUE) < 0 )
  31. {
  32. printf( " call listen failure!\n " );
  33. exit( 1 );
  34. }
  35. while ( 1 )
  36. { // server loop will nerver exit unless any body kill the process
  37. char buf[BUFFER_SIZE];
  38. long timestamp;
  39. socklen_t length = sizeof (cliaddr);
  40. clifd = accept(servfd,( struct sockaddr * ) & cliaddr, & length);
  41. if (clifd < 0 )
  42. {
  43. printf( " error comes when call accept!\n " );
  44. break ;
  45. }
  46. strcpy(buf,WELCOME_MESSAGE);
  47. // inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE);
  48. printf( " from client,IP:%s,Port:%d\n " ,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
  49. timestamp = time(NULL);
  50. strcat(buf, " timestamp in server: " );
  51. strcat(buf,ctime( & timestamp));
  52. send(clifd,buf,BUFFER_SIZE, 0 );
  53. close(clifd);
  54. } // exit
  55. close(servfd);
  56. return 0 ;
  57. }

Copyright © Linux教程網 All Rights Reserved