推荐阅读:
[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网络编程打下坚实基础。
本文目录导读:
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 *)&
本文标签属性:
Linux网络编程:linux网络编程书
高效网络通信:网络通信必备的三个条件
Linux网络编程基础:linux网络编程基础课程