返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ TCP网络编程详细讲解
  • 911
分享到

C++ TCP网络编程详细讲解

2024-04-02 19:04:59 911人浏览 八月长安
摘要

目录tcp介绍与编程流程TCP C/S架构TCP客户端编程流程1. 创建TCP套接字2. connect连接服务器3. send发送请求4. recv接收应答(默认带阻塞)5. cl

TCP介绍与编程流程

1、面向连接的流式协议;可靠、出错重传、且每收到一个数据都要给出相应的确认

2、通信之前需要建立链接

3、服务器被动链接,客户端是主动链接

TCP C/S架构

TCP客户端编程流程

  1. Socket 创建套接字
  2. connect 连接服务器
  3. send 发送请求
  4. recv 接收应答
  5. close

1. 创建TCP套接字

socket创建的套接字:没有端口、主动连接别人

int sockfd = socket(AF_INET, SOCK_STREAM, 0);

注:TCP是SOCK_STREAM, UDP为SOCK_DGRAM

2. connect连接服务器

如果sockfd没有被bind绑定,第一次调用connect系统自动分配随机端口,后续使用该端口

int connect(int socket, const struct sockaddr *address, socklen_t address_len)

注:如果客户端和服务器通信,必须使用connect事先建立连接

3. send发送请求

ssize_t send(int socket, const void *buffer, size_t length, int flags)

4. recv接收应答(默认带阻塞)

ssize_t recv(int socket, void *buffer, size_t length, int flags);

5. close

#include <unistd.h>
int close(int fildes);

6. 客户端编程流程代码

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
int main(int arGC, char const *argv[])
{
	//创建tcp套接字 SOCK_STREAN
	int sockfd = socket(AF_INET, SOCK_STREAM, 0);
	//connect连接服务器(知道服务器地址信息)
	struct sockaddr_in ser_addr;
	bzero(&ser_addr, sizeof(ser_addr));
	ser_addr.sin_family = AF_INET;
	ser_addr.sin_port = htons(8000);
	ser_addr.sin_addr.s_addr = inet_addr("10.9.21.211");
	connect(sockfd, (struct sockaddr *)&ser_addr, sizeof(ser_addr));
	//客户端发送请求
	send(sockfd, "hello tcp", strlen("hello tcp"), 0 );
	//客户端接收服务器的应答
	unsigned char buf[1500] = "";
	int len = recv(sockfd, buf, sizeof(buf), 0);
	printf("服务器的应答:%s\n", buf);
	//关闭套接字
	close(sockfd);
	return 0;
}

TCP服务端编程流程

  1. socket 创建套接字
  2. bind 绑定固定的port、ip地址信息
  3. listen 监听套接字 创建连接队列
  4. accept
  5. send 发送请求
  6. recv 接收应答
  7. close

1. 创建TCP套接字

socket创建的套接字

int sockfd = socket(AF_INET, SOCK_STREAM, 0);

注:TCP是SOCK_STREAM, UDP为SOCK_DGRAM

2. bind给服务器绑定固定的port与IP地址信息

struct sockaddr_in my_addr;
bzero(&my_addr, sizeof(my_addr)):
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(8000);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr)):

3. listen监听并创建队列

listen监听:等待客户端的连接到来,经过三次握手(底层自动),将客户端放入入连接队列

#include <sys/socket.h>
int listen(int socket, int backlog);

4. accept提取客户端的连接(阻塞)

#include <sys/socket.h>
int accept(int sockfd,struct sockaddr *cliaddr, socklen_t *addrlen);

注:返回的是一个已连接套接字,服务器只能通过已连接套接字和客户端进行数据通信

5. send 发送消息到客户端

ssize_t send(int socket, const void *buffer, size_t length, int flags)

注:如果ssize_t>0,表示发送成功(实际发送的字节数)

  如果ssize_t为-1,表示发送是失败

  tcp不允许send发送0长度报文(服务端接收0长度报文则为客户端断开连接)

  udp允许sendto发送0长度报文

6. recv 接收客户端的消息

ssize_t recv(int socket, void *buffer, size_t length, int flags);

注:如果ssize_t为0,表示客户端已经断开连接

  如果ssize_t>0,表示recv收到的实际字节数

  如果ssize_t为-1,表示recv读取数据出错

7. close关闭所有套接字

#include <unistd.h>
int close(套接字);

注:close后会导致对方recv收到0长度报文

8. TCP服务端编程流程代码

#include <stdio.h>
#include <sys/socket.h> //socket
#include <netinet/in.h> //struct sockaddr_in
#include <string.h>     //memset
#include <arpa/inet.h>  //htos
#include <unistd.h>     //close
int main()
{
    //创建套接字
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(sockfd < 0)
	{
		perror("cockt");
		return 0;
	}
    //bind绑定固定的port、ip地址信息
    struct sockaddr_in my_addr;
    bzero(&my_addr, sizeof(my_addr));
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(9000);
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    int ret = bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr));
	if(ret == -1)
	{
		perror("bind");
		return 0;
	}
	//监听套接字 创捷连接队列
	ret = listen(sockfd, 10);
	if(ret == -1)
	{
		perror("listen");
		return 0;
	}
	//提取客户端的连接
	while(1)
	{
		//一次只能提取一个客户端
		struct sockaddr_in cli_addr;
		socklen_t cli_len = sizeof(cli_addr);
		int cfd = accept(sockfd, (struct sockaddr *)&cli_addr, &cli_len);
		if(cfd < 0 ) //提取失败
		{
			perrer("accept\n");
			break;
		}
		else
		{
			char ip[16] = "";
			unsigned short port = 0;
			inet_ntop(AF_INET, &cli_addr.sin_addr.s_addr, ip, 16);
			port = ntohs(cli_addr.sin_port);
			//打印客户端的信息
			printf("客户端:%s %d connected\n", ip, port);
			while(1)
			{
				//获取客户端的请求
				unsigned char buf[1500] = "";
				int len = recv(cfd, buf, sizeof(buf), 0);
				if(len == 0) //客户端已经关闭
				{
					//关闭与客户端连接的套接字
					close(cfd);
					break;
				}
				//应答客户端
				send(cfd, buf, len, 0);
			}
		}	
	}
	//关闭监听套接字
	close(sockfd);
	return 0;
}

到此这篇关于c++ TCP网络编程详细讲解的文章就介绍到这了,更多相关C++ TCP内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++ TCP网络编程详细讲解

本文链接: https://lsjlt.com/news/167963.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++ TCP网络编程详细讲解
    目录TCP介绍与编程流程TCP C/S架构TCP客户端编程流程1. 创建TCP套接字2. connect连接服务器3. send发送请求4. recv接收应答(默认带阻塞)5. cl...
    99+
    2024-04-02
  • C++网络编程详细讲解
    目录一、网络编程二、库示例练习一、网络编程 尽管 Boost.Asio 可以异步处理任何类型的数据,但它主要用于网络编程。这是因为 Boost.Asio 早在添加额外的 I/O 对象...
    99+
    2022-11-13
    C++网络编程 C++网络通信编程
  • Linux网络编程wait()和waitpid()的详细讲解
    本篇内容介绍了“Linux网络编程wait()和waitpid()的详细讲解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!客户端断开连接后,...
    99+
    2023-06-13
  • 网络编程—tcp
              一、TCP简介           二、tcp网络程序-客户端           三、tcp网络程序-服务器           四、案例:文件下载器           五、tcp三次握手、四次挥手        ...
    99+
    2023-01-31
    网络编程 tcp
  • 网络编程(详细)
    文章目录 网络编程的概念网络模型OSI 七层模型七层模型释义通信特点 TCP/IP 五层模型区别 网络编程的目的网络编程中的两个要素 IP 地址IP 地址类型IP 地址 `J...
    99+
    2023-09-13
    网络 服务器 网络协议
  • C++ Socket实现TCP与UDP网络编程
    目录前言TCP1). 服务器2). 客户端3). TCP聊天小项目UDP1). 服务器2). 客户端总结前言 socket编程分为TCP和UDP两个模块,其中TCP是可靠的、安全的,...
    99+
    2024-04-02
  • C/C++网络编程基础知识超详细讲解上部分(系统性学习day11)
    目录 前言 一、网络的含义与构成 含义: 构成:  二、网络的体系结构 1>OSI七层模型 2>TCP/IP协议体系结构  3>数据经过体系结构,怎么封装  4>端口号 5>大小端序 6>TCP/UDP传输层的协议  三、系统函数API学...
    99+
    2023-10-21
    网络 学习 c语言 c# 开发语言
  • socket编程的详细讲解
    目录1:socket大致介绍2:TCP/IP协议3:回过头再来理解socket4:socket的一些接口函数原理5:socket的一个例子,总结上述的问题6:上面例子用到的知识点7:...
    99+
    2024-04-02
  • .NET网络编程——TCP通信
    一、网络编程的基本概念 : 1. 网络         就是将不同区域的电脑连接到一起,组成局域网、城域网或广域网。把分部在不同地理区域的计算机于专门的外部设备用通信线路 互联成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相...
    99+
    2023-08-31
    网络 tcp/ip 服务器 .net eclipse java
  • Java网络编程 - TCP通信
    文章目录 TCP通信快速入门(一发一收)编写客户端代码编写服务器代码 多发多收多发多收(同时接受多个客户端)线程池优化 TCP通信 快速入门(一发一收) TCP协议回顾: TCP是一种面向连接,安全、可靠的...
    99+
    2023-08-16
    网络 tcp/ip java
  • C# 多线程详细讲解
    多线程是指在一个程序中同时执行多个线程,每个线程可以独立执行不同的任务。在 C# 中,可以使用 System.Threading 命...
    99+
    2023-09-09
    C#
  • JavaTCP网络通信协议详细讲解
    TCP与UDP都属于TCP/IP协议 TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的...
    99+
    2024-04-02
  • C#网络编程TCP基本概念是什么
    这篇文章主要介绍“C#网络编程TCP基本概念是什么”,在日常操作中,相信很多人在C#网络编程TCP基本概念是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#网络编程TCP基本概念是什么”的疑惑有所帮助!...
    99+
    2023-06-18
  • Kotlinserver多线程编程详细讲解
    目录service 是什么多线程编程Service 基本用法service 是什么 Service是实现程序后台运行的解决方案,适合执行非交互,后台预先的任务,即使用户打开其他应用,...
    99+
    2023-01-30
    Kotlin server多线程编程 Kotlin server Kotlin多线程编程
  • rust异步编程详细讲解
    目录简化版本 Future理解Future的模型async/awit 使用简化版本 Future // wake 函数 reactor发现状态是ready 通知executor 函数...
    99+
    2022-12-16
    rust异步编程 rust异步原理
  • 网络技术——网络运维工程师必会的网络知识(2)(详细讲解)
    作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。   座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 网络传输介质 信号分类和失真来源地址:https...
    99+
    2023-09-12
    网络 服务器 运维
  • C++BoostAtomic详细讲解
    目录一、说明二、示例和代码一、说明 Boost.Atomic 提供类 boost::atomic,可用于创建原子变量。它们被称为原子变量,因为所有访问都是原子的。 Boost.Ato...
    99+
    2022-11-21
    C++ Boost Atomic C++ Atomic
  • C语言TCP网络编程环境怎么搭建
    要搭建C语言TCP网络编程环境,首先需要安装一个C语言编译器,比如gcc。然后需要使用socket库来进行网络编程。 以下是一个简单...
    99+
    2024-03-02
    C语言
  • 详细讲解计算机网络——应用层
    目录应用层协议一、DNS1、DNS 是什么2、域名结构3、域名服务器4、DNS 解析流程5、DNS 服务器查询方式(1)迭代查询(2)递归查询6、DNS 缓存机制7、DNS 使用 U...
    99+
    2024-04-02
  • Java之网络编程案例讲解
    Java基础之网络编程 基本概念 IP:每个电脑都有一个IP地址,在局域网内IP地址是可变的。 网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作