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网络编程的精髓,为开发更复杂的网络应用程序打下坚实基础。
热门推荐
做好清洁卫生,助力中小学生全面发展
“长命菜”马齿苋:营养超柠檬,可治湿疹痢疾
羽绒服能干洗吗?洗衣机清洗羽绒服会爆炸?正确的清洗方法看这里!
鲜地百合饮加中药漱口水,双管齐下解决口干困扰
欠条被起诉会怎样?法律后果及电子欠条预防方案
红烧鲤鱼炖豆腐:健康美味的秘密武器
双肺结节是肺结核吗?影像学特征帮你判断
深呼吸加适度运动,秋冬季节这样保护肺健康
针灸治疗助男子摆脱突发性耳聋困扰
从争吵到和解:如何利用冷静期修复夫妻关系
小芳如何用理解和沟通化解婆媳矛盾
海南文昌必去五景:铜鼓岭、椰林、石头公园等
清东陵 vs 清西陵:谁才是真正的宝藏?
顺治帝的宠妃之争:董鄂妃与佟佳氏的权力博弈
【深度】催婚催生:日本在少子化时代中挣扎与尝试
中医专家教你调理上热下寒体质,泡脚、饮食调节实用指南
飞行新体验:个性化服务与低空旅游双管齐下
郭京飞陈数加盟《小站警事》,改编自获奖小说
郭京飞新剧《小站警事》:以轻松幽默展现基层警队文化
五日线教你玩转短期投资
五日线解析:抓住股市最新动向
凤凰古城的诗意角落:沱江畔的吊脚楼
凤凰古城:沈从文笔下的诗意世界
凤凰古城七大最美拍摄点揭秘
微信发原图当心隐私泄露!
调味品使用技巧全攻略:从基础到复合,让菜肴更美味
梁育帅首战奥运摘铜,中国跆拳道再添新星
吃不厌的年菜,是家的味道:浙江11市除夕餐桌不能少的菜都是啥
口干别光喝水!调节室内湿度才是治本之策
“天然矿泉水”与“水果之王”:秋冬补水的最佳拍档