目标:
  完成一个精简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. vue启动问题(You may use special comments to disable some warnings. Use // eslint-disable-next-line to ignore the next line. Use /* eslint-disable */ to ignore all warnings in a file.)

    解决vue启动出现: 在build/webpack.base.conf.js文件中,把...(config.dev.useEslint ? [createLintingRule()] : [])注释或 ...

  2. Linux不同机器文件挂载

    由于此前发布项目应用时,需要对两台文件服务器进行文件挂载,所以才实际第一次接触到这个名词,但由于一直以来自己没有真正的去操作过,只是停留在一些理论层次,所以今天记录一下这个实现过程,以备后用. 使用设 ...

  3. 关于spark与scala版本问题记录

    记录一下版本问题: spark与scala版本对应问题: 1.官网会给出,如下,spark2.3.1默认需要scala2.11版本 2.在maven依赖网中也可以看到,如下 3.关于idea开发版本中 ...

  4. postfix -- 发件调试

    按照教程(https://www.cnblogs.com/huandada/p/10554603.html)搭建好postfix之后,由于收件的邮件运营商的限制,部分邮件不能正常发送,需要更多其他配置 ...

  5. 如何在组件中监听vuex数据变化(当vuex中state变化时,子组件需要进行更新,怎么做?)

    todo https://blog.csdn.net/qq_37899792/article/details/97640434

  6. Java使用FileOutputStream写入文件

    From: http://beginnersbook.com/2014/01/how-to-write-to-a-file-in-java-using-fileoutputstream/ /* 使用F ...

  7. ionic1使用imagepicker在安卓手机上闪退问题

    在上一篇文章中,提到了如何在ionic1中使用imagepicker插件,并且实现该插件显示中文(汉化)问题有兴趣可以看看:ionic1使用ImagePicker插件并且显示中文(汉化) 1.这次要解 ...

  8. 小程序踩坑之获取不到e.target.dataset的值

    在页面与js传值中我们经常用到data-id="1"的方式,然后通过e.target.dataset.id取id的值今天在获取值时怎么也取不到,后来发现e对象有currentTar ...

  9. C++入门经典-例6.15-通过字符串函数连接两个字符数组

    1:代码如下 // 6.15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  10. LVS负载均衡DR工作流程

    LVS负载均衡DR工作流程 (a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链. 此时报文的源IP为CIP,目标IP为VIP (b) PRE ...