目标:
  完成一个精简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 84
14 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 84
12 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 }

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

c++ tcp 服务器和客户端例子的更多相关文章

  1. python socket之tcp服务器与客户端demo

    python socket之tcp服务器与客户端demo 作者:vpoet mails:vpoet_sir@163.com server: # -*- coding: cp936 -*- ''' 建立 ...

  2. Python 绝技 —— TCP服务器与客户端

    i春秋作家:wasrehpic 0×00 前言 「网络」一直以来都是黑客最热衷的竞技场.数据在网络中肆意传播:主机扫描.代码注入.网络嗅探.数据篡改重放.拒绝服务攻击……黑客的功底越深厚,能做的就越多 ...

  3. Linux系统编程(32)—— socket编程之TCP服务器与客户端

    TCP协议的客户端/服务器程序的一般流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后, ...

  4. 【卷二】网络二—TCP服务器与客户端

    经过上回简单地介绍,大家对服务器多少应该清楚一些了吧!还记得TCP: (Transmission Control Protocol) 传输控制协议? 还记得IP: (Internet Protocol ...

  5. Node学习笔记:建立TCP服务器和客户端之间的通信

    结构: socket是应用层和传输层的桥梁.(传输层之上的协议所涉及的数据都是在本机处理的,并没进入网络中) 涉及数据: socket所涉及的数据是报文,是明文. 作用: 建立长久链接,供网络上的两个 ...

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

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

  7. socket | tcp客户端 tcp服务器 udp客户端 udp 服务器 创建方法

    tcp服务器 #coding=utf-8 ''' 这里是tcp服务器端,要先启动 ''' import socket import threading bind_ip = "0.0.0.0& ...

  8. TCP服务器和客户端_Socket编程

    TCP服务器 服务器启动文件 1 import java.io.IOException; 2 import java.net.ServerSocket; 3 import java.net.Socke ...

  9. php编写tcp服务器和客户端程序

    这是我从别的地方看到的. 1.修改php.ini,打开extension=php_sockets.dll 2.客户端程序 SocketClient.php <?php set_time_limi ...

随机推荐

  1. nginx跨域设置&文件上传大小限制

    在部署项目的时候碰到这么一个问题:XMLHttpRequest cannot load,下面阐述一下这个问题 问题背景: 用nginx+tomcat部署项目.tomcat用的8080端口,nginx用 ...

  2. canvas画圆又毛边

    canvas使用arc()画园有毛边,如图:,只需给其添加width,height即可,直接上代码 <!DOCTYPE html> <html lang="en" ...

  3. vue前端与django后端数据交互

    //把数据传到路径为/airCdt/的django后端函数进行数据处理 onSubmit(){ const dict={ 'floor': this.formLabelAlign.floor, 'ro ...

  4. JAVA笔记12-接口interface

    1.概念:接口是抽象方法和常量值得定义的集合.本质上,接口是一种特殊的抽象类,这种抽象类只包含常量和方法的定义,而没有变量和方法的实现. 接口定义举例: 2.接口特性: (1)接口可以多重实现:(接口 ...

  5. LINUX笔记之二常用命令(文件处理命令)

    一.概述 1. “.”开头的文件是隐藏文件,大小写敏感是因为用C语言编写 2. DOS中 cd..可回到父目录 在LINUX中要用cd ..(用空格) 3. 4.LINUX命令有两种:仅root可执行 ...

  6. python读取文件出现\ufeff问题

    现象: 读取csv文件,表头为'ID',但读取后显示'\ufeffID',所以使用dict['ID']读取会报错 原因: 该文件保存时保存了BOM,保存于文件头部 解决: 将原有的 file_cont ...

  7. 遍历文件夹 DirectoryInfo类

    该类有三个方法: GetDirectories()  当前目录的子目录 GetFiles()   当前目录的文件列表 GetFileSystemInfos()  当前目录的文件.子目录,返回强类型Fi ...

  8. 51 Nod 1486 大大走格子

    1486 大大走格子  题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  关注 有一个h行w列的棋盘,里面有一些格子是不 ...

  9. codevs 5929 亲戚x

                         题目描述 Description 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. ...

  10. windows怎么远程访问deepin linux桌面

    deepin linux端安装anydesk 1.首先点击打开任务栏上的“深度商店” 2.打开后搜索anydesk. 3.点击进入后按“安装”即可,安装完成即可在“深度商店”点击“打开”运行anyde ...