huanayun
hengtianyun
vps567
莱卡云

[Linux操作系统]Linux网络编程基础,开启网络通信的大门|linux 网络编程 教程,Linux网络编程基础,掌握Linux网络编程基础,开启高效网络通信之旅

PikPak

推荐阅读:

[AI-人工智能]免翻墙的AI利器:樱桃茶·智域GPT,让你轻松使用ChatGPT和Midjourney - 免费AIGC工具 - 拼车/合租账号 八折优惠码: AIGCJOEDISCOUNT2024

[AI-人工智能]银河录像局: 国内可靠的AI工具与流媒体的合租平台 高效省钱、现号秒发、翻车赔偿、无限续费|95折优惠码: AIGCJOE

[AI-人工智能]免梯免翻墙-ChatGPT拼车站月卡 | 可用GPT4/GPT4o/o1-preview | 会话隔离 | 全网最低价独享体验ChatGPT/Claude会员服务

[AI-人工智能]边界AICHAT - 超级永久终身会员激活 史诗级神器,口碑炸裂!300万人都在用的AI平台

本文介绍了Linux网络编程的基础知识,涵盖网络通信的核心概念,旨在帮助读者开启网络编程的大门。内容包括Linux环境下网络编程的基本原理、关键技术和实践教程,为深入学习Linux网络编程打下坚实基础。

本文目录导读:

  1. Linux网络编程基本概念
  2. Linux网络编程核心API
  3. Linux网络编程实践应用

Linux作为一种开源的操作系统,以其高效、稳定和灵活的特性,在服务器、嵌入式设备和云计算等领域得到了广泛应用,网络编程是Linux系统开发的重要组成部分,掌握Linux网络编程基础对于开发高效、稳定的网络应用至关重要,本文将从Linux网络编程的基本概念、核心API以及实践应用等方面进行介绍。

Linux网络编程基本概念

1、网络协议

网络协议是计算机网络中进行数据交换的规则和约定,常见的网络协议有TCP/IP、UDP、HTTP、FTP等,Linux网络编程主要基于TCP/IP协议族,包括传输控制协议(TCP)和用户数据报协议(UDP)。

2、套接字(Socket)

套接字是网络通信过程中端点的抽象概念,可以看作是不同进程间通信的“门”,在Linux系统中,套接字是一种特殊的文件描述符,用于实现进程间通信。

3、网络地址

网络地址用于标识网络中的设备,在IPv4中,网络地址由32位二进制数组成,分为网络部分和主机部分,IPv6使用128位二进制数表示网络地址。

Linux网络编程核心API

1、socket函数

socket函数用于创建套接字,其原型为:

int socket(int domain, int type, int protocol);

参数domain指定创建套接字的域,通常为AF_INET(IPv4)或AF_INET6(IPv6);参数type指定套接字的类型,如SOCK_STREAM(TCP)或SOCK_DGRAM(UDP);参数protocol指定套接字使用的协议,通常为0,表示自动选择。

2、bind函数

bind函数用于将套接字绑定到指定的网络地址和端口,其原型为:

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数sockfd为创建的套接字文件描述符;参数addr为指向网络地址结构的指针;参数addrlen为地址结构的大小。

3、listen函数

listen函数用于监听套接字上的连接请求,其原型为:

int listen(int sockfd, int backlog);

参数sockfd为创建的套接字文件描述符;参数backlog指定等待连接队列的最大长度。

4、accept函数

accept函数用于接受连接请求,其原型为:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数sockfd为监听套接字文件描述符;参数addr为指向网络地址结构的指针;参数addrlen为地址结构的大小。

5、send函数和reCV函数

send函数和recv函数用于发送和接收数据,其原型分别为:

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);

参数sockfd为套接字文件描述符;参数buf为指向数据的指针;参数len为数据长度;参数flags为操作标志。

Linux网络编程实践应用

1、简单TCP客户端和服务器

下面是一个简单的TCP客户端和服务器示例:

服务器端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};
    const char *hello = "Hello from server";
    // 创建socket文件描述符
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }
    // 绑定socket到端口8080
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }
    // 监听socket
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }
    // 接受连接
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }
    // 读取数据
    read(new_socket, buffer, 1024);
    printf("Message from client: %s
", buffer);
    // 发送数据
    send(new_socket, hello, strlen(hello), 0);
    printf("Hello message sent
");
    return 0;
}

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
    struct sockaddr_in address;
    int sock = 0, valread;
    struct sockaddr_in serv_addr;
    const char *hello = "Hello from client";
    char buffer[1024] = {0};
    // 创建socket文件描述符
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("
 Socket creation error 
");
        return -1;
    }
    memset(&serv_addr, '0', sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(8080);
    // 将地址从文本形式转换为二进制形式
    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
        printf("
Invalid address/ Address not supported 
");
        return -1;
    }
    // 连接到服务器
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        printf("
Connection Failed 
");
        return -1;
    }
    // 发送数据
    send(sock, hello, strlen(hello), 0);
    printf("Hello message sent
");
    // 读取数据
    valread = read(sock, buffer, 1024);
    printf("Message from server: %s
", buffer);
    return 0;
}

2、简单UDP客户端和服务器

下面是一个简单的UDP客户端和服务器示例:

服务器端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
    int server_fd;
    struct sockaddr_in address;
    char buffer[1024] = {0};
    const char *hello = "Hello from server";
    int addrlen = sizeof(address);
    // 创建socket文件描述符
    if ((server_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }
    // 绑定socket到端口8080
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }
    // 接收数据
    recvfrom(server_fd, (char *)buffer, 1024, 0, (struct sockaddr *)&address, (socklen_t *)&addrlen);
    printf("Message from client: %s
", buffer);
    // 发送数据
    sendto(server_fd, (const char *)hello, strlen(hello), 0, (const struct sockaddr *)&address, addrlen);
    printf("Hello message sent
");
    return 0;
}

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
    struct sockaddr_in address;
    int sock = 0, valread;
    char buffer[1024] = {0};
    const char *hello = "Hello from client";
    // 创建socket文件描述符
    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        printf("
 Socket creation error 
");
        return -1;
    }
    memset(&address, '0', sizeof(address));
    address.sin_family = AF_INET;
    address.sin_port = htons(8080);
    // 将地址从文本形式转换为二进制形式
    if (inet_pton(AF_INET, "127.0.0.1", &address.sin_addr) <= 0) {
        printf("
Invalid address/ Address not supported 
");
        return -1;
    }
    // 发送数据
    sendto(sock, (const char *)hello, strlen(hello), 0, (const struct sockaddr *)&address, sizeof(address));
    printf("Hello message sent
");
    // 接收数据
    valread = recvfrom(sock, (char *)buffer, 1024, 0, (struct sockaddr *)&address, (socklen_t *)&
bwg Vultr justhost.asia racknerd hostkvm pesyun Pawns


本文标签属性:

Linux网络编程:linux网络编程书

高效网络通信:网络通信必备的三个条件

Linux网络编程基础:linux网络编程基础课程

原文链接:,转发请注明来源!