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 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 服务器和客户端例子相关推荐
- TCP服务器和客户端的链接例子(侧重点在注意关闭套接子,减少套接子的描述子)
TCP服务器和客户端的链接例子(侧重点在注意关闭套接子,减少套接子的描述子) 每个文件或套接口都有一个访问计数,该访问计数在文件表项中维护,它表示当前指向该文件或套接口的打开的描述字个数. 每个文件, ...
- python应用系列教程——python使用socket创建tcp服务器和客户端
全栈工程师开发手册 (作者:栾鹏) python教程全解 python使用socket创建tcp服务器和客户端. 服务器端为一个时间戳服务器,在接收到客户端发来的数据后,自动回复. 客户端,等待用户输 ...
- 服务器主动发送fin信号,tcp 服务器向客户端发送FIN
tcp 服务器向客户端发送FIN 内容精选 换一换 ELB的常见异常返回码有400.403.502.504等.若遇到这些返回码建议您先直接访问后端云服务器,查看是否是后端云服务器的异常.若后端云服务器 ...
- 基于Python Tkiner、thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信
基于Python Tkiner.thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信 完整代码下载地址:基于Python Tkiner.thread与soc ...
- Qt 零基础设计实现TCP服务器和客户端上位机(零基础实战详解,附源码文件)
文章目录 TCP和UDP TCP的三次握手和四次分手 TCP和UDP的区别 关于Socket(套接字) Qt TCP服务器的设计与实现 使用Qt的 帮助 TCP服务器和客户端 区别 UI界面设计和原则 ...
- 【TCP服务器和客户端的简单编写】
TCP服务器和客户端的简单编写 TCP简介 TCP是什么 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IE ...
- python tcp服务器模板_python socket之tcp服务器与客户端示例
Python中用socket编写服务器和客户端... 先说下我的问题,本来预想是,客户端连上服务器,然后向服务器发送信息服务器端代码 while 1: buf = s.recv(1024) 改成 wh ...
- python写服务器端qt客户端_python写一些简单的tcp服务器和客户端
代码贴上,做个记录 TcpClient # -*- coding:utf-8 -*- import socket target_host = "127.0.0.1" #服务器端地址 ...
- php soecket服务器搭建_Linux系统编程(32)—— socket编程之TCP服务器与客户端
TCP协议的客户端/服务器程序的一般流程 aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgQAAAJmCAYAAAAjPpjHAAAgAElEQVR4A ...
最新文章
- 0x35.数论 - 组合数学与计数
- PHP 如何获取二维数组中某个key的集合(高性能查找)
- 从零点五开始用Unity做半个2D战棋小游戏(七)
- P2839 [国家集训队]middle(二分 套 主席树)
- 从“专用”到“通用” 阿里平头哥野心何在?
- 【Java 代码实例 6】FileUtils、StringUtil、CollectionUtils、ArrayUtils(附代码示例)
- win7自带桌面便签
- android 屏幕共享 chrome,Chrome屏幕共享功能接入指南
- 男朋友智商测试大集结(一):Oracle数据库查询操作练习81题(附答案)
- 作为一名优秀的程序员,如何得体地辞职
- firefox百度贴吧发不出表情的解决办法
- mkisofs命令制作光盘ISO
- Unity3D坦克大战(附代码和原理讲解)
- 记一次定位解决SpringBoot中内嵌Tomcat的Bug问题
- 如何在Excel中启用宏?
- Unknown column 'xxxx' in 'field list'
- java 静态导入_JAVA静态导入(import static)详解
- robomongo超时
- 真正可用win10 x64位twain协议虚拟扫描仪.net C#Twain连接打印机扫描仪winform测试demo
- 【剑灵攻略】001、底部菜单栏实现