linux网络编程浅谈

简介: linux网络编程浅谈

本篇文章来讲一下linux网络编程

Linux网络编程是指在Linux操作系统上进行网络通信的应用程序开发。它涉及使用套接字(Sockets)来创建客户端和服务器应用程序,以实现跨网络的数据传输和通信。

以下是Linux网络编程的一些基本概念:

  1. 套接字(Sockets)套接字是网络通信的端点。它提供了一个编程接口,使应用程序能够通过网络发送和接收数据。套接字可以分为不同类型的,如流套接字(SOCK_STREAM,用于TCP协议)和数据报套接字(SOCK_DGRAM,用于UDP协议)。
  2. IP地址和端口号:IP地址是计算机在网络上的唯一标识,而端口号则是计算机上运行的程序用于网络通信的标识。当应用程序想要建立网络连接时,它需要指定要连接的IP地址和端口号。
  3. 套接字编程套接字编程涉及使用特定的系统调用来创建、连接、读写和关闭套接字。常见的套接字编程函数包括socket()bind()listen()accept()connect()send()recv()等。
  4. 客户端/服务器架构:在网络编程中,通常使用客户端/服务器架构。服务器应用程序在特定端口上监听连接请求,而客户端应用程序则连接到服务器以发送和接收数据。
  5. 阻塞与非阻塞套接字:套接字可以分为阻塞和非阻塞两种模式。在阻塞模式下,套接字操作会阻塞调用线程的执行,直到操作完成。而在非阻塞模式下,套接字操作会立即返回,无论操作是否完成。
  6. 并发与多线程:为了提高服务器的性能,通常需要使用并发技术来处理多个客户端连接。这可以通过多线程、多进程或异步I/O等方式实现。
  7. 协议:网络编程中常用的协议包括TCP(传输控制协议)和UDP(用户数据报协议)。TCP提供可靠的、有序的、基于字节流的传输服务,而UDP则提供无连接的、不可靠的、基于数据报的传输服务。

以下是一个简单的 Linux 套接字编程案例,使用 C++ 实现。这个案例将展示一个基本的 TCP 服务器和客户端,服务器接收客户端发送的消息并回应。

首先是 TCP 服务器的代码:

// TCPServer.cpp  
#include <iostream>  
#include <cstring>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <unistd.h>  
  
const int PORT = 8080;  
const int BUFFER_SIZE = 1024;  
  
int main() {  
    int serverSocket, clientSocket;  
    struct sockaddr_in serverAddr, clientAddr;  
    char buffer[BUFFER_SIZE];  
    socklen_t addrLen = sizeof(clientAddr);  
  
    // 创建套接字  
    serverSocket = socket(AF_INET, SOCK_STREAM, 0);  
    if (serverSocket < 0) {  
        std::cerr << "Error creating socket" << std::endl;  
        return -1;  
    }  
  
    // 初始化服务器地址结构  
    memset(&serverAddr, 0, sizeof(serverAddr));  
    serverAddr.sin_family = AF_INET;  
    serverAddr.sin_addr.s_addr = INADDR_ANY;  
    serverAddr.sin_port = htons(PORT);  
  
    // 绑定套接字到地址  
    if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {  
        std::cerr << "Error binding socket" << std::endl;  
        close(serverSocket);  
        return -1;  
    }  
  
    // 开始监听  
    if (listen(serverSocket, 5) < 0) {  
        std::cerr << "Error listening on socket" << std::endl;  
        close(serverSocket);  
        return -1;  
    }  
  
    std::cout << "Server listening on port " << PORT << "..." << std::endl;  
  
    // 接受客户端连接  
    clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &addrLen);  
    if (clientSocket < 0) {  
        std::cerr << "Error accepting socket" << std::endl;  
        close(serverSocket);  
        return -1;  
    }  
  
    std::cout << "Client connected" << std::endl;  
  
    // 接收和发送消息  
    int bytesRead = recv(clientSocket, buffer, BUFFER_SIZE, 0);  
    if (bytesRead < 0) {  
        std::cerr << "Error receiving data" << std::endl;  
        close(clientSocket);  
        close(serverSocket);  
        return -1;  
    }  
  
    std::cout << "Received from client: " << buffer << std::endl;  
  
    const char* response = "Message received!";  
    send(clientSocket, response, strlen(response), 0);  
  
    std::cout << "Response sent to client" << std::endl;  
  
    // 关闭套接字  
    close(clientSocket);  
    close(serverSocket);  
  
    return 0;  
}

TCP 客户端的代码:

// TCPClient.cpp  
#include <iostream>  
#include <cstring>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <unistd.h>  
#include <arpa/inet.h>  
  
const char* SERVER_IP = "127.0.0.1";  
const int PORT = 8080;  
const int BUFFER_SIZE = 1024;  
  
int main() {  
    int clientSocket;  
    struct sockaddr_in serverAddr;  
    char buffer[BUFFER_SIZE];  
  
    // 创建套接字  
    clientSocket = socket(AF_INET, SOCK_STREAM, 0);  
    if (clientSocket < 0) {  
        std::cerr << "Error creating socket" << std::endl;  
        return -1;  
    }  
  
    // 初始化服务器地址结构  
    memset(&serverAddr, 0, sizeof(serverAddr));  
    serverAddr.sin_family = AF_INET;  
    serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);  
    serverAddr.sin_port = htons(PORT);  
  
    // 连接到服务器  
    if (connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {  
        std::cerr << "Error connecting to server" << std::

TCP 服务器

功能
  • 服务器监听指定的端口(在这个例子中是 8080)。
  • 接受来自客户端的连接请求。
  • 接收客户端发送的消息。
  • 回应客户端的消息。
  • 关闭连接。
代码结构
  1. 变量声明:定义服务器套接字(serverSocket),客户端套接字(clientSocket),服务器地址(serverAddr),客户端地址(clientAddr),以及接收数据的缓冲区(buffer)。
  2. 创建套接字:使用 socket() 函数创建一个新的套接字。
  3. 绑定套接字:使用 bind() 函数将套接字绑定到服务器的 IP 地址和端口。
  4. 开始监听:使用 listen() 函数开始监听连接请求。
  5. 接受连接:使用 accept() 函数接受客户端的连接请求,并返回一个新的套接字用于与客户端通信。
  6. 接收数据:使用 recv() 函数从客户端接收数据。
  7. 发送响应:使用 send() 函数向客户端发送响应。
  8. 关闭套接字:使用 close() 函数关闭客户端套接字和服务器套接字。

TCP 客户端

功能
  • 连接到指定的服务器和端口(在这个例子中是本机的 8080 端口)。
  • 向服务器发送消息。
  • 接收服务器的响应。
  • 关闭连接。
代码结构
  1. 变量声明:定义客户端套接字(clientSocket),服务器地址(serverAddr),以及发送和接收数据的缓冲区(buffer)。
  2. 创建套接字:使用 socket() 函数创建一个新的套接字。
  3. 连接到服务器:使用 connect() 函数连接到服务器的 IP 地址和端口。
  4. 发送数据:使用 send() 函数向服务器发送数据。
  5. 接收响应:使用 recv() 函数从服务器接收响应。
  6. 关闭套接字:使用 close() 函数关闭客户端套接字。

总结:网络编程的核心无非就是使用网络协议 然后将服务端和客户端连接起来 实现协议的通信 一般都是多个客户端 一个服务端 然后加上数据库来存储数据

相关文章
|
14天前
|
安全 Linux 虚拟化
网络名称空间在Linux虚拟化技术中的位置
网络名称空间(Network Namespaces)是Linux内核特性之一,提供了隔离网络环境的能力,使得每个网络名称空间都拥有独立的网络设备、IP地址、路由表、端口号范围以及iptables规则等。这一特性在Linux虚拟化技术中占据了核心位置🌟,它不仅为构建轻量级虚拟化解决方案(如容器📦)提供了基础支持,也在传统的虚拟机技术中发挥作用,实现资源隔离和网络虚拟化。
网络名称空间在Linux虚拟化技术中的位置
|
14天前
|
网络协议 安全 Linux
Linux网络名称空间之独立网络资源管理
Linux网络名称空间是一种强大的虚拟化技术🛠️,它允许用户创建隔离的网络环境🌐,每个环境拥有独立的网络资源和配置。这项技术对于云计算☁️、容器化应用📦和网络安全🔒等领域至关重要。本文将详细介绍在Linux网络名称空间中可以拥有的独立网络资源,并指出应用开发人员在使用时应注意的重点。
|
15天前
|
安全 网络协议 Linux
Linux网络名称空间概述
Linux网络名称空间是操作系统级别的一种虚拟化技术🔄,它允许创建隔离的网络环境🌐,使得每个环境拥有自己独立的网络资源,如IP地址📍、路由表🗺️、防火墙规则🔥等。这种技术是Linux内核功能的一部分,为不同的用户空间进程提供了一种创建和使用独立网络协议栈的方式。本文旨在全方面、多维度解释Linux网络名称空间的概念、必要性和作用。
Linux网络名称空间概述
|
22天前
|
Linux
Linux中centos桌面消失网络图标
Linux中centos桌面消失网络图标
13 0
|
1月前
|
Shell Linux C语言
【Shell 命令集合 网络通讯 】Linux 查看系统中的UUCP日志文件 uulog命令 使用指南
【Shell 命令集合 网络通讯 】Linux 查看系统中的UUCP日志文件 uulog命令 使用指南
29 0
|
13天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
37 6
|
1月前
|
网络协议 Shell Linux
【Shell 命令集合 网络通讯 】Linux 追踪数据包在网络中的路径 traceroute命令 使用指南
【Shell 命令集合 网络通讯 】Linux 追踪数据包在网络中的路径 traceroute命令 使用指南
40 0
|
3天前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
|
15天前
|
网络协议 Linux
在Linux中,管理和配置网络接口
在Linux中管理网络接口涉及多个命令,如`ifconfig`(在新版本中被`ip`取代)、`ip`(用于网络设备配置)、`nmcli`(NetworkManager的CLI工具)、`nmtui`(文本界面配置)、`route/ip route`(处理路由表)、`netstat/ss`(显示网络状态)和`hostnamectl/systemctl`(主机名和服务管理)。这些命令帮助用户启动接口、设置IP地址、查看连接和路由信息。不同发行版可能有差异,建议参考相应文档。
19 4
|
23小时前
|
网络协议 Linux Shell
【linux网络(一)】初识网络, 理解四层网络模型
【linux网络(一)】初识网络, 理解四层网络模型