多线程并发服务器与客户端 ---20100514

//服务器

 
1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <sys/socket.h>
  4 #include <arpa/inet.h>
  5 #include <unistd.h>
  6 #include <stdlib.h>
  7 #include <string.h>
  8
  9 #define SERV_IP "127.0.0.1"  //本机IP
 10 #define SERV_PORT 8000
 11
 12 struct ARG{
 13     int connfd;
 14     struct sockaddr_in client;
 15     int other;
 16 };
 17
 18 void *function(void *arg);
 19 void sys_err(char* err)
 20 {
 21     perror(err);
 22     exit(1);
 23 }
 24 int main(void)
 25 {
 26     int sock_fd;
 27     int connfd;
 28     int ret;
 29     socklen_t addrlen;
 30     struct ARG * arg;
 31     pthread_t tid;
 32
 33     struct sockaddr_in cli_addr;
 34     struct sockaddr_in serv_addr;
 35
 36     memset(&serv_addr, 0, sizeof(serv_addr));
 37     serv_addr.sin_family = AF_INET;
 38     serv_addr.sin_port = htons(SERV_PORT);
 39 //    serv_addr.sin_addr.s_addr = inet_addr(SERV_IP);
 40     inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr.s_addr);
 41
 42     sock_fd = socket(AF_INET, SOCK_STREAM, 0);
 43     if(sock_fd == -1)
 44         sys_err("fail to socket");
 45     int opt = SO_REUSEADDR;
46     setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
 47     ret = bind(sock_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
 48     if(ret == -1)
 49         sys_err("fail to bind");
 50
 51     ret = listen(sock_fd, 20);
 52     if(ret == -1)
 53         sys_err("fail to listen");
 54     //net_fd = accept(sock_fd, (struct sockaddr* )&cli_addr, &addrlen);
 55     //if(net_fd == -1)
 56       //  sys_err("fail to accept");
 57
 58     char buf[1024];
 59     int readsize;
 60     while(1)
 61     {
 62         if((connfd = accept(sock_fd, (struct sockaddr*)&cli_addr, &addrlen)) == -1)
 63             sys_err("fail to accept");
 64         arg = (struct ARG *)malloc(sizeof(struct ARG));
 65         arg->client = cli_addr;
 66         arg->connfd = connfd;
 67
 68         if(pthread_create(&tid, NULL, function, (void *)arg))
 69             sys_err("pthread create error");
 70
 71
 72
 73
 74
 75     }
 76
 77     close(sock_fd);
 78
 79     return 0;
 80 }
 81
 82 void *function(void *arg)
 83 {
 84     int net_fd;
85     int num;
 86     char buf[1024];
 87     struct sockaddr_in client;
 88
 89     net_fd = ((struct ARG *)arg)->connfd;
 90     client = ((struct ARG *)arg)->client;
 91
 92     while(1)
 93     {
 94         num = recv(net_fd, buf, 1024, 0);
 95         if(num == 0)
 96         {
 97             printf("the client<%s> exit/n", inet_ntoa(client.sin_addr));
 98             break;
 99         }
100         printf("You got message from client:%s/n", inet_ntoa(client.sin_addr));
101
102         write(STDOUT_FILENO, buf, num);
103
104     }
105     free(arg);
106     close(net_fd);
107     pthread_exit(NULL);
108 }

 


 




//客户端

 1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <arpa/inet.h>
  4 #include <sys/socket.h>
  5 #include <sys/types.h>
  6 #include <stdlib.h>
  7 #include <string.h>
  8
  9 #define SERV_IP "127.0.0.1"
 10 #define SERV_PORT 8000
 11
 12 void sys_err(char* err)
 13 {
 14     perror(err);
 15     exit(0);
 16 }
 17 int main(void)
 18 {
 19     int sockfd;
 20     int ret;
 21
 22     struct sockaddr_in serv_addr;
 23     memset(&serv_addr, 0, sizeof(serv_addr));
 24     serv_addr.sin_family = AF_INET;
 25     serv_addr.sin_port = htons(SERV_PORT);
26     serv_addr.sin_addr.s_addr = inet_addr(SERV_IP);
 27
 28     sockfd = socket(AF_INET, SOCK_STREAM, 0);
 29     if(sockfd == -1)
 30         sys_err("fail to socket");
 31     ret = connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
 32     if(ret == -1)
 33         sys_err("fail to connect");
 34     char buf[1024];
 35     int readsize;
 36
 37     while(1)
 38     {
 39         readsize = read(STDIN_FILENO, buf, 1024);
 40         if(strncmp(buf, "exit", 4) == 0)
 41         {
 42             printf("client has exited");
 43             break;
 44         }
 45
 46         write(sockfd, buf, readsize);
 47     }
 48     close(sockfd);
49
 50 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪游东戴河

你就是这个世界的唯一

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值