C++初学者必看:TCP/IP网络编程入门
创作时间:
作者:
@小白创作中心
C++初学者必看:TCP/IP网络编程入门
引用
CSDN
等
8
来源
1.
https://blog.csdn.net/erroror/article/details/143261581
2.
https://blog.csdn.net/qq_38880380/article/details/139116732
3.
https://learn.microsoft.com/zh-cn/troubleshoot/windows-client/networking/tcpip-addressing-and-subnetting
4.
https://www.tutorialspoint.com/cplusplus/cpp_socket_programming.htm
5.
https://www.cnblogs.com/codestack/category/1494258.html
6.
https://www.ecice06.com/EN/10.19678/j.issn.1000-3428.0063200
7.
https://www.geeksforgeeks.org/socket-programming-cc/
8.
https://www.cisco.com/c/zh_cn/support/docs/wireless/5500-series-wireless-controllers/113344-cuwn-ppm.html
TCP/IP网络编程是每个C++程序员都需要掌握的重要技能。本文将从TCP/IP模型的基础知识开始,逐步介绍如何使用C++进行socket编程,帮助初学者快速入门网络编程。
01
TCP/IP模型基础
在学习网络编程之前,我们首先需要了解TCP/IP模型的基本结构。TCP/IP模型将网络通信分为四个层次:
- 应用层:负责处理特定的应用程序细节,如HTTP、FTP等协议。
- 传输层:提供端到端的数据传输服务,主要协议有TCP和UDP。
- 网络层:负责数据包的路由选择,主要协议是IP。
- 链路层:负责在同一网络中传输数据帧。
在网络通信中,每个设备都有一个唯一的IP地址,用于标识其在网络中的位置。此外,每个网络应用程序都会使用一个端口号,用于区分不同的服务。例如,HTTP服务通常使用80端口,而HTTPS使用443端口。
02
Socket编程基础
Socket(套接字)是网络通信中的一个核心概念。它类似于电话插孔,是应用程序进行网络通信的端点。在C++中,我们可以使用socket API来创建和管理socket。
创建Socket
使用socket()函数可以创建一个新的socket:
#include <sys/socket.h>
#include <netinet/in.h>
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
AF_INET
表示使用IPv4地址族SOCK_STREAM
表示使用TCP协议- 最后一个参数0表示使用默认协议
绑定地址
创建socket后,需要将其与本地IP地址和端口绑定:
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(12345); // 使用12345端口
addr.sin_addr.s_addr = INADDR_ANY; // 监听所有网络接口
bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
监听连接
对于服务器端socket,需要调用listen()函数来开始监听连接请求:
listen(sockfd, 5); // 5是等待队列的最大长度
接受连接
当有客户端连接请求时,使用accept()函数来接受连接:
int clientfd = accept(sockfd, NULL, NULL);
数据传输
使用send()和recv()函数可以在socket之间发送和接收数据:
const char* message = "Hello, World!";
send(clientfd, message, strlen(message), 0);
char buffer[1024];
recv(clientfd, buffer, sizeof(buffer), 0);
03
实践示例:服务器与客户端通信
下面是一个简单的服务器和客户端通信示例:
服务器端代码
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.s_addr = INADDR_ANY;
bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
listen(sockfd, 5);
std::cout << "Server is listening on port 12345..." << std::endl;
int clientfd = accept(sockfd, NULL, NULL);
char buffer[1024];
recv(clientfd, buffer, sizeof(buffer), 0);
std::cout << "Received message: " << buffer << std::endl;
const char* response = "Hello from server!";
send(clientfd, response, strlen(response), 0);
close(clientfd);
close(sockfd);
return 0;
}
客户端代码
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sockfd, (struct sockaddr*)&addr, sizeof(addr));
const char* message = "Hello from client!";
send(sockfd, message, strlen(message), 0);
char buffer[1024];
recv(sockfd, buffer, sizeof(buffer), 0);
std::cout << "Received message: " << buffer << std::endl;
close(sockfd);
return 0;
}
04
学习建议与资源推荐
实践是关键:理论知识固然重要,但网络编程更需要动手实践。建议搭建一个本地测试环境,尝试编写更多复杂的网络应用程序。
推荐书籍:
- 《TCP/IP详解》:深入讲解TCP/IP协议的权威著作
- 《UNIX网络编程》:经典的网络编程教材
在线资源:
- Tutorialspoint C++ Socket Programming:详细的socket编程教程
- Beej's Guide to Network Programming:非常适合初学者的网络编程指南
通过不断学习和实践,你将逐步掌握TCP/IP网络编程的精髓,为开发更复杂的网络应用程序打下坚实基础。
热门推荐
重庆神龙峡风景区游玩攻略:特色景点、路线及周边设施全解析
前端开发中如何找人接单
共赴与自然生灵的“守护之约”!广州启动保护野生动物宣传月活动
佛山祖庙游玩攻略:千年古建与非遗文化的完美融合
链接建设的重要性与实用技巧提升网站流量的全方位指南
如何将微信历史记录转移到新手机的完整指南
燃油车挑战与未来趋势探讨:2025车市新篇揭秘
专家解读:腹膜外剖宫产虽有优势,但并非适合所有孕妈
如何在 Windows 11 上禁用 USB 端口和 USB 存储设备
稻盛和夫的经营秘诀,你get了吗?
膈肌粘连的症状及治疗方法
殷商的人祭文化:考古发现揭示的恐怖真相
长法小课堂丨借条、欠条、收条,我该怎么写?
心电图学习系列之三:房室传导阻滞
职上网:社会工作者=社区工作者?两者有什么区别?
缓冲放大器的类型、原理与应用
退休工资的高低与职称直接相关吗?剪不断理还乱的关系
酸枣育苗一亩地多少颗
国有企业是什么?从定义到未来展望的全面解析
相机150mm等于手机多少倍
如何分析市盈率和市净率?这些指标对投资决策有哪些影响?
MQTT 与 WebSocket:关键差异与应用场景
地支“卯”与其他地支的关系及影响
移动硬盘双盘和单盘区别
压力容器安全技术监察规程审查频率指南
Android AOSP 架构和各层次开发内容介绍
卤水蛋隔夜还能吃吗?卤蛋的正确保存方法
中日文化交流活动在博罗举行 共鉴中华传统文化魅力
嵌入式系统实时任务调度算法优化与实现
星露谷物语矮人卷轴使用方法