c++ tcp 服务器和客户端例子
目标:
完成一个精简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 服务器和客户端例子的更多相关文章
- python socket之tcp服务器与客户端demo
python socket之tcp服务器与客户端demo 作者:vpoet mails:vpoet_sir@163.com server: # -*- coding: cp936 -*- ''' 建立 ...
- Python 绝技 —— TCP服务器与客户端
i春秋作家:wasrehpic 0×00 前言 「网络」一直以来都是黑客最热衷的竞技场.数据在网络中肆意传播:主机扫描.代码注入.网络嗅探.数据篡改重放.拒绝服务攻击……黑客的功底越深厚,能做的就越多 ...
- Linux系统编程(32)—— socket编程之TCP服务器与客户端
TCP协议的客户端/服务器程序的一般流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后, ...
- 【卷二】网络二—TCP服务器与客户端
经过上回简单地介绍,大家对服务器多少应该清楚一些了吧!还记得TCP: (Transmission Control Protocol) 传输控制协议? 还记得IP: (Internet Protocol ...
- Node学习笔记:建立TCP服务器和客户端之间的通信
结构: socket是应用层和传输层的桥梁.(传输层之上的协议所涉及的数据都是在本机处理的,并没进入网络中) 涉及数据: socket所涉及的数据是报文,是明文. 作用: 建立长久链接,供网络上的两个 ...
- python写一些简单的tcp服务器和客户端
代码贴上,做个记录 TcpClient # -*- coding:utf-8 -*- import socket target_host = "127.0.0.1" #服务器端地址 ...
- socket | tcp客户端 tcp服务器 udp客户端 udp 服务器 创建方法
tcp服务器 #coding=utf-8 ''' 这里是tcp服务器端,要先启动 ''' import socket import threading bind_ip = "0.0.0.0& ...
- TCP服务器和客户端_Socket编程
TCP服务器 服务器启动文件 1 import java.io.IOException; 2 import java.net.ServerSocket; 3 import java.net.Socke ...
- php编写tcp服务器和客户端程序
这是我从别的地方看到的. 1.修改php.ini,打开extension=php_sockets.dll 2.客户端程序 SocketClient.php <?php set_time_limi ...
随机推荐
- eclipse切换 package explorer
- 51 Nod 不重叠的线段
#include<bits/stdc++.h> #define in(X) scanf("%d",&X) #define out(X) printf(" ...
- PTA 刷题与Z老师的头发
刷题与Z老师的头发 (10 分) 在Pintia上,每天Z老师出题.小盆友们刷题.Z老师的头发遵从以下规律: 1.每天生长出60根头发: 2.每出一道题,减少20根头发: 3.每天结束时统计累积做题情 ...
- 原生Js_使用setInterval() 方法实现图片轮播功能
用javascript图片轮播功能 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- ...扩展运算符+rest参数+call/apply/bind
之前在set,map里面有提过扩展运算符的概念,但是今天偶然遇到一个问题,类似于扩展运算符的经典用法,突然发现对其了解不是很深,所以再来整理一下扩展运算符的相关知识. 重点:扩展运算符内部调用的是数据 ...
- maven的依赖传递及冲突
A->B(compile) 第一关系: a依赖b compile B->C(compile) 第二关系: b依赖c compile 当在A中配置 <dep ...
- CppCheck介绍与使用
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u011012932/article/details/52778149 简述 Cppcheck 是一种 ...
- ssh框架中的分页查询
ssh中的分页查询是比较常用的,接下来我用代码来介绍如何实现一个分页查询 首先建立一个Model用来储存查询分页的信息 package com.haiziwang.qrlogin.utils; imp ...
- VC中MessageBox与AfxMessageBox用法与区别
一.MessageBox()用法 1.函数原型 Messagebox函数在Win32 API和MFC里的定义有区别. Win32 API的定义如下: int WINAPI MessageBox( ...
- N2RR
一.背景 氨(NH 3)是一种新兴的能量载体,在液氨中含有17.6%(重量)的氢,而在甲醇中的含量为12.5%(重量),很可能成为未来氢能经济的有希望的候选者.然而,如果基于NH 3的肥料不足以养活世 ...