目标:
  完成一个精简TCP服务器,可接收来自多个用户的请求,并返回结果。

思路:
  (1)服务器
      C++ TCP服务器的实现主要由以下几个函数来完成:
        a)socket
     创建服务器监听套接字
  b)bind
     绑定服务器监听信息到套接字上
  c)listen
     开始监听,接收客户端的TCP连接
  d)accept
     从listen所维护的队列中取出一条已连接的TCP,返回该连接的socket描述字
        e)服务器客户端在连接socket描述字上进行消息通信
  f) close
     关闭打开着的套接字
      为了更好的服务多个发起请求的客户端,在e步骤上,我们使用fork以派生子进程来独立处理每个客户端的请求。
      if( (childpid=fork())==0)
     {
      close(listenfd);         //从父进程复制下来的监听socket描述符要关闭。
      //communication(connfd);
      exit(0);
     }
(2)客户端
    客户端的实现主要由以下函数完成:
     a)socket
        创建客户端连接套接字
    b)connect
    向指定服务器发起连接请求
     c)服务器客户端在连接socket描述字上进行消息通信
     d)close
        关闭打开着的套接字

实现:

 1 #include<sys/types.h> 2 #include<sys/socket.h> 3 #include<strings.h> 4 #include<arpa/inet.h> 5 #include<unistd.h> 6 #include<stdlib.h> 7 #include<stdio.h> 8 #include<string.h> 9 #include<errno.h>10 #include<signal.h>11 #include<sys/wait.h>12 13 #define LISTEN_PORT 8414 void str_echo(int sockfd)15 {16     ssize_t n;17     char line[512];18 19     printf("ready to read\n");20     while( (n=read(sockfd,line,512))>0 )21     {22             line[n]='\0';23             printf("Client: %s\n",line);24             bzero(&line,sizeof(line));25     }26     printf("end read\n");27 }28 29 int main(int argc, char **argv)30 {31     int listenfd, connfd;32     pid_t childpid;33     socklen_t chilen;34 35     struct sockaddr_in chiaddr,servaddr;36 37     listenfd=socket(AF_INET,SOCK_STREAM,0);38     if(listenfd==-1)39     {40         printf("socket established error: %s\n",(char*)strerror(errno)); return -1;41     }42 43     bzero(&servaddr,sizeof(servaddr));44     servaddr.sin_family=AF_INET;45     servaddr.sin_addr.s_addr=htonl(INADDR_ANY);46     servaddr.sin_port=htons(LISTEN_PORT);47 48     int bindc=bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));49     if(bindc==-1)50     {51         printf("bind error: %s\n",strerror(errno)); return -1;52     }53 54     listen(listenfd,5);55     for(;;)56     {57         chilen=sizeof(chiaddr);58 59         connfd=accept(listenfd,(struct sockaddr*)&chiaddr,&chilen);60         if(connfd==-1)61         {    printf("accept client error: %s\n",strerror(errno)); return -1; }62         else        63             printf("client connected\n");64 65         if((childpid=fork())==0)66         {67             close(listenfd);68             printf("client from %s\n",inet_ntoa(chiaddr.sin_addr));69             str_echo(connfd);70             exit(0);    71         }72         else if (childpid<0)73             printf("fork error: %s\n",strerror(errno));74         close(connfd);75     }76 }

 1 #include<sys/types.h> 2 #include<stdlib.h> 3 #include<stdio.h> 4 #include<unistd.h> 5 #include<sys/socket.h> 6 #include<strings.h> 7 #include<string.h> 8 #include<arpa/inet.h> 9 #include<errno.h>10 11 #define SERVER_PORT 8412 void str_cli(char *data,int sockfd)13 {14     char recv[512];15 16     int wc=write(sockfd,data,strlen(data));17 18     exit(0);19 }20 int main(int argc, char **argv)21 {22     int sockfd;23     struct sockaddr_in servaddr;24 25     if(argc!=3)26         return -1;27 28     sockfd=socket(AF_INET,SOCK_STREAM,0);29     if(sockfd==-1)30     {31         printf("socket established error: %s\n",(char*)strerror(errno)); return -1;32     }33 34     bzero(&servaddr,sizeof(servaddr));35     servaddr.sin_family=AF_INET;36     servaddr.sin_port=htons(SERVER_PORT);37     inet_pton(AF_INET,argv[1],&servaddr.sin_addr);38 39     printf("client try to connect\n");40     int conRes=connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));41     if(conRes==-1)42     {    43         printf("connect error: %s\n",strerror(errno)); return -1;44     }45 46     str_cli(argv[2],sockfd);47 48     exit(0);49 }

分析:
   最简单的服务器仅能完成基本的通信,并没有考虑其他边界或者异常情况,同时,采用子进程处理客户端连接,一旦子进程数量增多,并且子进程需要长时间的运行,那么服务器性能将严重下降。

转载于:https://www.cnblogs.com/daochong/p/6873315.html

c++ tcp 服务器和客户端例子相关推荐

  1. TCP服务器和客户端的链接例子(侧重点在注意关闭套接子,减少套接子的描述子)

    TCP服务器和客户端的链接例子(侧重点在注意关闭套接子,减少套接子的描述子) 每个文件或套接口都有一个访问计数,该访问计数在文件表项中维护,它表示当前指向该文件或套接口的打开的描述字个数. 每个文件, ...

  2. python应用系列教程——python使用socket创建tcp服务器和客户端

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python使用socket创建tcp服务器和客户端. 服务器端为一个时间戳服务器,在接收到客户端发来的数据后,自动回复. 客户端,等待用户输 ...

  3. 服务器主动发送fin信号,tcp 服务器向客户端发送FIN

    tcp 服务器向客户端发送FIN 内容精选 换一换 ELB的常见异常返回码有400.403.502.504等.若遇到这些返回码建议您先直接访问后端云服务器,查看是否是后端云服务器的异常.若后端云服务器 ...

  4. 基于Python Tkiner、thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信

    基于Python Tkiner.thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信 完整代码下载地址:基于Python Tkiner.thread与soc ...

  5. Qt 零基础设计实现TCP服务器和客户端上位机(零基础实战详解,附源码文件)

    文章目录 TCP和UDP TCP的三次握手和四次分手 TCP和UDP的区别 关于Socket(套接字) Qt TCP服务器的设计与实现 使用Qt的 帮助 TCP服务器和客户端 区别 UI界面设计和原则 ...

  6. 【TCP服务器和客户端的简单编写】

    TCP服务器和客户端的简单编写 TCP简介 TCP是什么 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IE ...

  7. python tcp服务器模板_python socket之tcp服务器与客户端示例

    Python中用socket编写服务器和客户端... 先说下我的问题,本来预想是,客户端连上服务器,然后向服务器发送信息服务器端代码 while 1: buf = s.recv(1024) 改成 wh ...

  8. python写服务器端qt客户端_python写一些简单的tcp服务器和客户端

    代码贴上,做个记录 TcpClient # -*- coding:utf-8 -*- import socket target_host = "127.0.0.1" #服务器端地址 ...

  9. php soecket服务器搭建_Linux系统编程(32)—— socket编程之TCP服务器与客户端

    TCP协议的客户端/服务器程序的一般流程 aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgQAAAJmCAYAAAAjPpjHAAAgAElEQVR4A ...

最新文章

  1. 0x35.数论 - 组合数学与计数
  2. PHP 如何获取二维数组中某个key的集合(高性能查找)
  3. 从零点五开始用Unity做半个2D战棋小游戏(七)
  4. P2839 [国家集训队]middle(二分 套 主席树)
  5. 从“专用”到“通用” 阿里平头哥野心何在?
  6. 【Java 代码实例 6】FileUtils、StringUtil、CollectionUtils、ArrayUtils(附代码示例)
  7. win7自带桌面便签
  8. android 屏幕共享 chrome,Chrome屏幕共享功能接入指南
  9. 男朋友智商测试大集结(一):Oracle数据库查询操作练习81题(附答案)
  10. 作为一名优秀的程序员,如何得体地辞职
  11. firefox百度贴吧发不出表情的解决办法
  12. mkisofs命令制作光盘ISO
  13. Unity3D坦克大战(附代码和原理讲解)
  14. 记一次定位解决SpringBoot中内嵌Tomcat的Bug问题
  15. 如何在Excel中启用宏?
  16. Unknown column 'xxxx' in 'field list'
  17. java 静态导入_JAVA静态导入(import static)详解
  18. robomongo超时
  19. 真正可用win10 x64位twain协议虚拟扫描仪.net C#Twain连接打印机扫描仪winform测试demo
  20. 【剑灵攻略】001、底部菜单栏实现

热门文章

  1. Qt DLL总结【一】-链接库预备知识
  2. Qt学习之如何启动和终止一个线程
  3. 到底什么是 ROI Pooling Layer ???
  4. -Java基础-方法
  5. AutoFac文档9(转载)
  6. 日期推算处理.sql
  7. 装箱与拆箱的概念及意义
  8. 在内存不足时,new (std::nothrow)并不抛出异常,而是将指针置NULL
  9. mysqlbinlog相关
  10. wubiuefi-支持新版本ubuntu的wubi