Chinaunix首页 | 论坛 | 博客
  • 博客访问: 130157
  • 博文数量: 43
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 175
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-10 12:33
文章存档

2016年(9)

2015年(34)

我的朋友

分类: LINUX

2015-12-05 13:39:42

学了个用Linux线程代替select的回射服务器

点击(此处)折叠或打开

  1. /*************************************************************************
  2.     > File Name: echo_cli.c
  3.     > Author: gwjiaoj
  4.     > Mail: jiaojinawei@163.com
  5.     > Created Time: Fri 27 Nov 2015 02:15:38 GMT
  6.  ************************************************************************/
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <errno.h>
  10. #include <unistd.h>
  11. #include <sys/socket.h>
  12. #include <sys/types.h>
  13. #include <netinet/in.h>
  14. #include <string.h>
  15. #include <strings.h>
  16. #include <pthread.h>

  17. #define ERR_EXIT(exp) do\
  18.     {\
  19.         perror(exp);\
  20.         exit(EXIT_FAILURE);\
  21.     } while (0)

  22. struct para
  23. {
  24.     int clifd;
  25.     FILE *fp;
  26. };

  27. void *str_cli(void *arg)
  28. {
  29.     struct para *para1 = NULL;
  30.     int clifd = 0;
  31.     FILE *fp = NULL;
  32.     char sendbuf[1500] = { 0 };

  33.     para1 = (struct para*)arg;
  34.     
  35.     clifd = para1->clifd;
  36.     fp = para1->fp;
  37.     
  38.     while(1)
  39.     {    
  40.         memset(sendbuf, 0 , sizeof(sendbuf));

  41.         if(fgets(sendbuf, sizeof(sendbuf), fp) == NULL)
  42.         {
  43.             ERR_EXIT("fgets error");
  44.         }
  45.         
  46.         if(write(clifd, sendbuf, strlen(sendbuf)) < 0)
  47.         {
  48.             ERR_EXIT("write error");
  49.         }
  50.     }

  51. }
  52. int main(int argc, void **argv)
  53. {
  54.     int localfd = 0;
  55.     struct sockaddr_in serveraddr = { 0 };
  56.     struct sockaddr_in localaddr = { 0 };
  57.     socklen_t addrlen = 0;
  58.     char recvbuf[1024] = { 0 };
  59.     char buff[1024] = { 0 };
  60.     struct para para2 = { 0 };
  61.     pthread_t tid = 0;

  62.     if(2 != argc)
  63.     {
  64.         printf("usage: a.out \n");
  65.         return 0;
  66.     }

  67.     if((localfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
  68.     {
  69.         ERR_EXIT("socket error");
  70.     }

  71.     memset(&serveraddr, 0, sizeof(serveraddr));
  72.     serveraddr.sin_family = AF_INET;
  73.     serveraddr.sin_port = htons(5188);
  74.     serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
  75.     if(connect(localfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
  76.     {
  77.         ERR_EXIT("connect error");
  78.     }
  79.     memset(&localaddr, 0, sizeof(localaddr));
  80.     addrlen = sizeof(localaddr);
  81.     if(getsockname(localfd, (struct sockaddr *)&localaddr, &addrlen) < 0)
  82.     {
  83.         ERR_EXIT("getsockname error");
  84.     }

  85.     inet_ntop(AF_INET, &localaddr.sin_addr, buff, sizeof(buff));

  86.     printf("ip: %s, port %d\n", buff, ntohs(localaddr.sin_port));

  87.     para2.clifd = localfd;
  88.     para2.fp = stdin;

  89.     if(pthread_create(&tid, NULL, str_cli, (void *)&para2) != 0)
  90.     {
  91.         ERR_EXIT("read error");
  92.     }

  93.     while(1)
  94.     {
  95.         memset(recvbuf, 0, sizeof(recvbuf));
  96.         if(read(localfd, recvbuf, sizeof(recvbuf)) < 0)
  97.         {
  98.             ERR_EXIT("read error");
  99.         }

  100.         if(fputs(recvbuf, stdout) == EOF)
  101.         {
  102.             ERR_EXIT("fputs error");
  103.         }
  104.     }

  105.     return 0;
  106. }


点击(此处)折叠或打开

  1. /*************************************************************************
  2.     > File Name: echo_serv.c
  3.     > Author: gwjiaoj
  4.     > Mail: jiaojinawei@163.com
  5.     > Created Time: Fri 27 Nov 2015 02:15:38 GMT
  6.  ************************************************************************/
  7. #include <pthread.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <errno.h>
  11. #include <unistd.h>
  12. #include <sys/socket.h>
  13. #include <sys/types.h>
  14. #include <netinet/in.h>
  15. #include <string.h>
  16. #include <strings.h>

  17. #define ERR_EXIT(exp) do\
  18.     {\
  19.         perror(exp);\
  20.         exit(EXIT_FAILURE);\
  21.     } while (0)

  22. void * do_it(void *pconnfd)
  23. {
  24.     int recvbuf[1500] = { 0 };
  25.     int connfd = (int)pconnfd;
  26.     pthread_detach(pthread_self());
  27.     printf("%d\n", connfd);
  28.     for( ; ; )
  29.     {
  30.         memset(recvbuf, 0, sizeof(recvbuf));
  31.         if(read(connfd, recvbuf, sizeof(recvbuf)) < 0)
  32.         {
  33.             ERR_EXIT("read");
  34.         }

  35.         printf("%s\n", recvbuf);

  36.         if(write(connfd, recvbuf, strlen(recvbuf)) < 0)
  37.         {
  38.             ERR_EXIT("write");
  39.         }
  40.     }

  41.     close(connfd);

  42.     return;
  43. }
  44. int main(int argc, void **argv)
  45. {
  46.     pthread_t tid = 0;
  47.     int listenfd = 0;
  48.     int connfd = 0;
  49.     struct sockaddr_in serveraddr = { 0 };
  50.     struct sockaddr_in peeraddr = { 0 };
  51.     char buff[1024] = { 0 };
  52.     socklen_t socklen = 0;

  53.     if((listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
  54.     {
  55.         ERR_EXIT("socket");
  56.     }

  57.     memset(&serveraddr, 0, sizeof(serveraddr));
  58.     serveraddr.sin_family = AF_INET;
  59.     serveraddr.sin_port = htons(5188);
  60.     serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);

  61.     if(bind(listenfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
  62.     {
  63.         ERR_EXIT("bind");
  64.     }

  65.     if(listen(listenfd, SOMAXCONN) < 0)
  66.     {
  67.         ERR_EXIT("listen");
  68.     }

  69.     while(1)
  70.     {
  71.         memset(&peeraddr, 0, sizeof(peeraddr));
  72.         socklen = sizeof(peeraddr);

  73.         if((connfd = accept(listenfd, (struct sockaddr *)&peeraddr, &socklen)) < 0)
  74.         {
  75.             ERR_EXIT("accept");
  76.         }
  77.         
  78.         inet_ntop(AF_INET, &peeraddr.sin_addr, buff, sizeof(buff));
  79.         printf("%d\n", connfd);
  80.         printf("ip: %s, port: %d\n", buff, peeraddr.sin_port);
  81.         if(0 != pthread_create(&tid, NULL, do_it, (void *)connfd))
  82.         {
  83.             ERR_EXIT("pthread");
  84.         }
  85.     }

  86.     return 0;
  87. }

阅读(1284) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~