TCP服务器的单进程实现

一、tcp_server(TCP服务器)

//tcp_server.c代码

  1 #include<stdio.h>                                                           
  2 #include<sys/types.h>
  3 #include<sys/socket.h>
  4 #include<string.h>
  5 #include<netinet/in.h>
  6 #include<arpa/inet.h>
  7 #include<string.h>
  8 #include<stdlib.h>
  9 
 10 static void usage(const char* proc)
 11 {
 12     printf("%s [local_ip][local_port]\n",proc);
 13 }
 14 
 15 int startup(const char* _ip, int _port)
 16 {
 17     int sock = socket(AF_INET, SOCK_STREAM, 0);
 18     if(sock < 0)
 19     {
 20         perror("socket");
 21         exit(2);
 22     }
 23     struct sockaddr_in local;
 24     local.sin_family = AF_INET;
 25     local.sin_port = htons(_port);
 26     local.sin_addr.s_addr = inet_addr(_ip);
 27     if( bind(sock,(struct sockaddr *)&local,sizeof(local)) < 0)
 28     {
 29         perror("bind");
 30         exit(3);
 31     }
 32     if(listen(sock, 5) < 0 )
 33     {
 34         perror("listen");
 35         exit(4);
 36     }
 37     return sock;
 38 }
 39 
 40 int main(int argc , char* argv[])
 41 {
 42     if(argc < 3)
 43     {
 44         usage(argv[0]);
 45         return 1;
 46     }   
 47     int listen_sock=startup(argv[1],atoi(argv[2]));
 48     while(1)
 49     {   
 50         struct sockaddr_in client;
 51         socklen_t len = sizeof(client);
 52         int new_fd = accept(listen_sock,(struct sockaddr *)&client, &len );
 53         if(new_fd < 0)
 54         {
 55             perror("accept");
 56             //can not exit;
 57             continue;
 58         }
 59         printf("get a new client\n");
 60         while(1)
 61         {
 62             char buf[1024];
 63             ssize_t s=read(new_fd,buf,sizeof(buf)-1);
 64             if(s > 0)
 65             {
 66                 buf[s]=0;
 67                 printf("client: %s\n",buf);
 68                 write(new_fd,buf,strlen(buf));
 69             }
 70             else
 71             {
 72                 printf("read done ....,break\n");
 73                 break;
 74             }
 75         }
 76     }
 77 return 0;
 78 }      

这里写图片描述

二、tcp_client(TCP客户端)

//tcp_client代码

  1 #include<stdio.h>                                                           
  2 #include<sys/types.h>
  3 #include<sys/socket.h>
  4 #include<string.h>
  5 #include<netinet/in.h>
  6 #include<arpa/inet.h>
  7 #include<stdlib.h>
  8 #include<string.h>
  9 static void usage(const char* proc)
 10 {
 11     printf("%s [local_ip][local_port]\n",proc);
 12 }
 13 
 14 int main(int argc , char* argv[])
 15 {
 16     if(argc < 3)
 17     {
 18         usage(argv[0]);
 19         return 1;
 20     }
 21     int sock = socket(AF_INET, SOCK_STREAM, 0);
 22       if(sock < 0)
 23       {
 24            perror("socket");
 25            return 2;
 26        }
 27       struct sockaddr_in remote;
 28       remote.sin_family=AF_INET;
 29       remote.sin_port=htons(atoi(argv[2]));
 30       remote.sin_addr.s_addr=inet_addr(argv[1]);
 31       if(connect(sock,(struct sockaddr *)&remote, sizeof(remote)) < 0 )
 32       {
 33            perror("connect");
 34            return 3;
 35        }
 36       while(1)
 37          {
 38                char buf[1024];
 39                printf("Please Enter #");
 40                fflush(stdout);
 41                ssize_t s=read(0, buf, sizeof(buf)-1);
 42                if(s > 0)
 43                {
 44                     buf[s-1]=0;
 45                     write(sock, buf, strlen(buf));
 46                     ssize_t _s=read(sock, buf, sizeof(buf)-1);      
 47                     if(_s > 0)
 48                     {
 49                          buf[_s]=0;
 50                          printf("server echo# %s\n",buf);
 51                      }
 52                }
 53          }
 54 return 0;  
 55 }         

这里写图片描述

三、结果图

这里写图片描述
这里写图片描述

四、总结

以上的代码还有待修改它只能实现单进程的连接服务器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值