目标:
  完成一个精简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. python获取网络图片

    方式1 使用urllib库 import urllib.request import os ,stat url = "https://cn.bing.com/th?id=OHR.Lidong ...

  2. [采坑] VS2015 warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失

    问题: Visual Studio 2015出现warning C4819: 该文件包含不能在当前代码页(936)中表示的字符.请将该文件保存为 Unicode 格式以防止数据丢失. 解决方案: 1. ...

  3. 51 Nod 1086 多重背包问题(二进制优化)

    1086 背包问题 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 有N种物品,每种物品的数量为C1,C2......Cn.从中任选若干件放 ...

  4. Tarjan求LCA胡乱写的板子 x

    首先Tarjan算法的基本思路: 1.任选一个点为根节点,从根节点开始. 2.遍历该点u所有子节点v,并标记这些子节点v已被访问过. 3.若是v还有子节点,继续搜索下去,否则下一步. 4.合并v到u上 ...

  5. 1143, 3997: Dilworth定理的简单应用

    偏序集上的最小链覆盖等于最长反链 于是两道题 1143: [CTSC2008]祭祀river 求偏序集上的最长反链 转换成偏序集上的最小链覆盖 求个闭包,转换成最小路径覆盖,二分图匹配一发 #incl ...

  6. R_Studio(关联)使用apriori函数简单查看数据存在多少条关联规则,并按支持度降序排序输出

    查看数据menu_orders.txt文件存在多少条关联规则,并按支持度降序排序输出 #导入arules包 install.packages("arules") library ( ...

  7. php的intval函数

    PHP intval() 函数 PHP 可用的函数PHP 可用的函数 intval() 函数用于获取变量的整数值. intval() 函数通过使用指定的进制 . PHP , PHP , PHP 语法 ...

  8. ubuntu16.04增大swap空间

    参见->这里 参见->这里

  9. leetcode 230二叉搜索树中第k小的元素

    通过stack进行中序遍历迭代,timeO(k),spaceO(1) /** * Definition for a binary tree node. * struct TreeNode { * in ...

  10. Object 源码阅读

    Object 源码阅读 /** * Object 类是类继承结构的根类,每一个类型都以 Object 作为其父类,包括数组. */ public class Object { private stat ...