问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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模型将网络通信分为四个层次:

  1. 应用层:负责处理特定的应用程序细节,如HTTP、FTP等协议。
  2. 传输层:提供端到端的数据传输服务,主要协议有TCP和UDP。
  3. 网络层:负责数据包的路由选择,主要协议是IP。
  4. 链路层:负责在同一网络中传输数据帧。

在网络通信中,每个设备都有一个唯一的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

学习建议与资源推荐

  1. 实践是关键:理论知识固然重要,但网络编程更需要动手实践。建议搭建一个本地测试环境,尝试编写更多复杂的网络应用程序。

  2. 推荐书籍

    • 《TCP/IP详解》:深入讲解TCP/IP协议的权威著作
    • 《UNIX网络编程》:经典的网络编程教材
  3. 在线资源

通过不断学习和实践,你将逐步掌握TCP/IP网络编程的精髓,为开发更复杂的网络应用程序打下坚实基础。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号