多clinet的C/S程序设计──样列代码

来源:互联网 发布:tftp 命令 端口 改端口 编辑:程序博客网 时间:2024/04/29 18:04
  1. /* tcp_server.c*/
  2. #include <stdio.h>
  3. #include <sys/socket.h>
  4. #include <arpa/inet.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #include <netinet/in.h>
  9. #define MAXPENDING 5 /* max client requests */
  10. #define BUFFSIZE 32
  11. int die(char *mess) {fprintf(stdout, mess); return 1;}
  12. int handle_client(int sock) {
  13.     char buffer[BUFFSIZE];
  14.     int received = -1;
  15.     
  16.     /* Receive message */
  17.     /*while (received <= 0)*/ {
  18.         if ((received = recv(sock, buffer, BUFFSIZE, 0)) < 0) {
  19.             die("Failed to receive initial bytes from client/n");
  20.         }
  21.     }
  22.     buffer[received] = '/0';
  23.     /* Send bytes and check for more incoming data in loop */
  24.     while (received > 0) {
  25.         fprintf(stdout, "Recieve: %s/n", buffer);
  26.         /* Send back received data */
  27.         if (send(sock, buffer, received, 0) != received) {
  28.             die("Failed to send bytes to client/n");
  29.         }
  30.         
  31.         /* Check for more data */
  32.         if ((received = recv(sock, buffer, BUFFSIZE, 0)) < 0) {
  33.             die("Failed to receive additional bytes from client/n");
  34.         }
  35.         buffer[received] = '/0';
  36.     }
  37.     
  38.     return 0;
  39. }
  40. int tcp_server_4(short port)
  41. {
  42.     int server_sock,client_sock,maxfd;
  43.     struct sockaddr_in server,client;
  44.     int received = 0;
  45.     fd_set fdR,fdR2;
  46.     int ret = 0;
  47.     /* create the tcp server socket */
  48.     if ((server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
  49.         return die("Failed to create tcp server socket/n");
  50.     }
  51.     /* construct the server sockaddr_in struct */
  52.     memset(&server, 0, sizeof(server));
  53.     server.sin_family = AF_INET;   /* internet/IP */
  54.     server.sin_addr.s_addr = htonl(INADDR_ANY);
  55.     server.sin_port = htons(port);
  56.     /* bind the server socket */
  57.     if (bind(server_sock, (struct sockaddr *)(&server), sizeof(server)) < 0) {
  58.         return die("Failed to bind the server socket./n");
  59.     }
  60.     /* listen on the server socket */
  61.     if (listen(server_sock, MAXPENDING) < 0) {
  62.         return die("Failed to listen on server socket/n");
  63.     }
  64.     /* initial fd sets */
  65.     FD_ZERO(&fdR);
  66.     FD_ZERO(&fdR2);
  67.     /* add server sock to fd sets */
  68.     FD_SET(server_sock, &fdR2);
  69.     maxfd = server_sock;
  70.     while (1) {
  71.         /* use the two fd just to distinguish current fd sets 
  72.          * and next time fd sets 
  73.          */
  74.         fdR = fdR2;
  75.         /* block when have data come to a fd */
  76.         fprintf(stdout, "Select intoi: fd [%d]/n", maxfd);
  77.         ret = select(maxfd+1, &fdR, NULL,NULL,NULL);
  78.         if (ret < 0) {
  79.             return die(" select fail");
  80.         }
  81.         fprintf(stdout, "Select a fd/n");
  82.         /* if have data come to server_sock , it is a client connect */
  83.         if (FD_ISSET(server_sock, &fdR)) {
  84.             int len = sizeof(client);
  85.             client_sock = accept(server_sock, (struct sockaddr *)&client, &len);
  86.             FD_SET(client_sock, &fdR2);
  87.             if (maxfd < client_sock) {
  88.                 maxfd = client_sock;
  89.             }
  90.         }
  91.         else if (FD_ISSET(client_sock, &fdR)) {
  92.            
  93.             handle_client(client_sock);
  94.             close(client_sock);
  95.             FD_CLR(client_sock, &fdR2);
  96.         }
  97.     }
  98.     return 0;
  99. }
  100. int tcp_server_3(short port)
  101. {
  102.     int server_sock,client_sock;
  103.     struct sockaddr_in server,client;
  104.     int received = 0;
  105.  
  106.     /* create the tcp server socket */
  107.     if ((server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
  108.         return die("Failed to create tcp server socket/n");
  109.     }
  110.     /* construct the server sockaddr_in struct */
  111.     memset(&server, 0, sizeof(server));
  112.     server.sin_family = AF_INET;   /* internet/IP */
  113.     server.sin_addr.s_addr = htonl(INADDR_ANY);
  114.     server.sin_port = htons(port);
  115.     /* bind the server socket */
  116.     if (bind(server_sock, (struct sockaddr *)(&server), sizeof(server)) < 0) {
  117.         return die("Failed to bind the server socket./n");
  118.     }
  119.     
  120.     /* listen on the server socket */
  121.     if (listen(server_sock, MAXPENDING) < 0) {
  122.         return die("Failed to listen on server socket/n");
  123.     }
  124.     /* run until cancelled */
  125.     while (1) {
  126.         unsigned int clientlen = sizeof(client);
  127.         pid_t pid;
  128.         /* wait for client connection */
  129.         if ((client_sock = accept(server_sock, (struct sockaddr *)&client, &clientlen)) < 0) {
  130.             return die("Failed to accept client connection/n");
  131.         }
  132.         
  133.         fprintf(stdout, "client connect ID:%d: %s/n", getpid(),inet_ntoa(client.sin_addr));
  134.         pid = fork();
  135.         if (0 == pid) {
  136.             close(server_sock);
  137.             handle_client(client_sock);
  138.             fprintf(stdout, "I'am child , i will die./n");
  139.             close(client_sock);
  140.             return 0;
  141.         } else {
  142.             close(client_sock);
  143.         }
  144.     }
  145.     return 0;
  146. }
  147. int tcp_server_2(short port)
  148. {
  149.     int server_sock,client_sock;
  150.     struct sockaddr_in server,client;
  151.     int received = 0;
  152.  
  153.     /* create the tcp server socket */
  154.     if ((server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
  155.         return die("Failed to create tcp server socket/n");
  156.     }
  157.     /* construct the server sockaddr_in struct */
  158.     memset(&server, 0, sizeof(server));
  159.     server.sin_family = AF_INET;   /* internet/IP */
  160.     server.sin_addr.s_addr = htonl(INADDR_ANY);
  161.     server.sin_port = htons(port);
  162.     /* bind the server socket */
  163.     if (bind(server_sock, (struct sockaddr *)(&server), sizeof(server)) < 0) {
  164.         return die("Failed to bind the server socket./n");
  165.     }
  166.     
  167.     /* listen on the server socket */
  168.     if (listen(server_sock, MAXPENDING) < 0) {
  169.         return die("Failed to listen on server socket/n");
  170.     }
  171.     /* run until cancelled */
  172.     while (1) {
  173.         unsigned int clientlen = sizeof(client);
  174.         pid_t pid;
  175.         pid = fork();
  176.         if (0 == pid) {
  177.             /* wait for client connection */
  178.             if ((client_sock = accept(server_sock, (struct sockaddr *)&client, &clientlen)) < 0) {
  179.                 return die("Failed to accept client connection/n");
  180.             }
  181.             fprintf(stdout, "client connect at pid:%d, ID:%d: %s/n", pid,getpid(),inet_ntoa(client.sin_addr));
  182.             handle_client(client_sock);
  183.             close(client_sock);
  184.             fprintf(stdout, "I'am child , i will die./n");
  185.             return 0;
  186.         }
  187.     }
  188.     return 0;
  189. }
  190. int tcp_server_1(short port)
  191. {
  192.     int server_sock,client_sock;
  193.     struct sockaddr_in server,client;
  194.     int received = 0;
  195.  
  196.     /* create the tcp server socket */
  197.     if ((server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
  198.         return die("Failed to create tcp server socket/n");
  199.     }
  200.     /* construct the server sockaddr_in struct */
  201.     memset(&server, 0, sizeof(server));
  202.     server.sin_family = AF_INET;   /* internet/IP */
  203.     server.sin_addr.s_addr = htonl(INADDR_ANY);
  204.     server.sin_port = htons(port);
  205.     /* bind the server socket */
  206.     if (bind(server_sock, (struct sockaddr *)(&server), sizeof(server)) < 0) {
  207.         return die("Failed to bind the server socket./n");
  208.     }
  209.     /* listen on the server socket */
  210.     if (listen(server_sock, MAXPENDING) < 0) {
  211.         return die("Failed to listen on server socket/n");
  212.     }
  213.     /* run until cancelled */
  214.     while (1) {
  215.         unsigned int clientlen = sizeof(client);
  216.         /* wait for client connection */
  217.         if ((client_sock = accept(server_sock, (struct sockaddr *)&client, &clientlen)) < 0) {
  218.             return die("Failed to accept client connection/n");
  219.         }
  220.         fprintf(stdout, "client connect: %s/n", inet_ntoa(client.sin_addr));
  221.         handle_client(client_sock);
  222.         close(client_sock);
  223.     }
  224.     return 0;
  225. }
  226. int main(int argc, char *argv[])
  227. {
  228.     int sock;
  229.    
  230.     if (argc != 3)
  231.     {
  232.         fprintf(stderr, "USAGE: tcp_server_test <mode>  <Port>/n");
  233.         return 1;
  234.     }
  235.     
  236.     switch (argv[1][0]) {
  237.         case '1':
  238.             return tcp_server_1((short)atoi(argv[2]));
  239.         case '2':
  240.             return tcp_server_2((short)atoi(argv[2]));
  241.          case '3':
  242.             return tcp_server_3((short)atoi(argv[2]));
  243.         case '4':
  244.             return tcp_server_4((short)atoi(argv[2]));
  245.         default:
  246.             fprintf(stderr, "USAGE: tcp_server_test <mode>  <Port>/n"); 
  247.     }
  248.     return 0;
  249. }
  250. /*=====================================================*/
  251. /* tcp_client */
  252. #include <stdio.h>
  253. #include <sys/socket.h>
  254. #include <arpa/inet.h>
  255. #include <stdlib.h>
  256. #include <string.h>
  257. #include <unistd.h>
  258. #include <netinet/in.h>
  259. #define BUFFSIZE 32
  260. int die(char *mess) {fprintf(stdout, mess); return 1;}
  261. int tcp_client_1(const char *ipaddr, short port, const char *message)
  262. {
  263.     int sock;
  264.     struct sockaddr_in server;
  265.     char buffer[BUFFSIZE];
  266.     unsigned int len;
  267.     int received = 0;
  268.  
  269.     /* create the tcp socket */
  270.     if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
  271.         die("Failed to create tcp socket/n");
  272.     }
  273.     /* construct the server sockaddr_in struct */
  274.     memset(&server, 0, sizeof(server));
  275.     server.sin_family = AF_INET;   /* internet/IP */
  276.     server.sin_addr.s_addr = inet_addr(ipaddr);
  277.     server.sin_port = htons(port);
  278.     /* establish connection */
  279.     if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
  280.         die("Failed to connect with server/n");
  281.     }
  282.     
  283.     /* send the word to the server */
  284.     len = strlen(message);
  285.     if (send(sock, message, len, 0) != len) {
  286.         die("Mismatch in number of send bytes/n");
  287.     }
  288.     fprintf(stdout, "Success to send message[%s]./n", message);
  289.     received = 0;
  290.     while (received < len) {
  291.         int bytes = 0;
  292.         if ((bytes = recv(sock, buffer, BUFFSIZE-1, 0)) < 1) {
  293.             die("Failed to receive bytes from server/n");
  294.         }
  295.         received += bytes;
  296.         buffer[bytes] = '/0';
  297.         fprintf(stdout, "Receive message[%s]./n", buffer);
  298.     }
  299.     fprintf(stdout, "/n");
  300.     close(sock);
  301.     return 0;
  302. }
  303. int main(int argc, char *argv[])
  304. {
  305.     int sock;
  306.     int i = 0;
  307.     char buffer[BUFFSIZE];
  308.  
  309.     if (argc != 4)
  310.     {
  311.         fprintf(stderr, "USAGE: tcp_client_test <Server IP> <Port> <message>/n");
  312.         exit(1);
  313.     }
  314.     
  315.     while (1) {
  316.         memset(buffer, 0, sizeof(buffer)); 
  317.         sprintf(buffer, "%s: %d", argv[3], i);
  318.         tcp_client_1(argv[1], (short)atoi(argv[2]), buffer);
  319.         i++;
  320.         sleep(2);
  321.     }
  322. }
注释比较少,有什么地方不懂得,一起讨论。与代码对应的内容介绍可以参看这篇文章http://blog.csdn.net/mythfish/archive/2008/08/01/2753132.aspx

原创粉丝点击