推荐阅读:
[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网络编程的基本概念、常用工具和技术,帮助读者从入门到实践。
网络编程基本概念
1、网络协议:网络协议是计算机网络中数据传输的规则和标准,常见的网络协议包括TCP(传输控制协议)、UDP(用户数据报协议)、IP(互联网协议)等。
2、套接字(Socket):套接字是网络通信的端点,提供了进程间通信的机制,Linux网络编程主要通过套接字实现。
3、客户端/服务器模型:这是网络编程中最常见的模型,客户端发送请求,服务器响应请求。
Linux网络编程环境搭建
1、安装Linux操作系统:可以选择Ubuntu、CentOS等发行版。
2、安装开发工具:如GCC编译器、Make工具等。
3、配置网络环境:确保网络连接正常,配置IP地址、网关等。
套接字编程基础
1、创建套接字:
```c
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、绑定地址:
```c
int bind(int sockfd, cOnst struct sockaddr *addr, socklen_t addrlen);
```
sockfd
:套接字文件描述符。
addr
:指向套接字地址结构的指针。
addrlen
:地址结构的长度。
3、监听连接(仅TCP):
```c
int listen(int sockfd, int backlog);
```
sockfd
:套接字文件描述符。
backlog
:最大连接队列长度。
4、接受连接(仅TCP):
```c
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
```
5、连接服务器(仅TCP客户端):
```c
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
```
6、数据传输:
- 发送数据:
```c
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
```
- 接收数据:
```c
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
```
TCP编程示例
服务器端代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.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"; // 创建套接字 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 绑定地址 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); } // 监听连接 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 "); close(new_socket); close(server_fd); return 0; }
客户端代码:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> int main() { int sock = 0; struct sockaddr_in serv_addr; char *hello = "Hello from client"; char buffer[1024] = {0}; // 创建套接字 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf(" Socket creation error "); return -1; } 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 "); // 接收数据 read(sock, buffer, 1024); printf("Message from server: %s ", buffer); close(sock); return 0; }
UDP编程示例
服务器端代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> int main() { int sockfd; char buffer[1024]; struct sockaddr_in servaddr, cliaddr; // 创建套接字 if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); } memset(&servaddr, 0, sizeof(servaddr)); memset(&cliaddr, 0, sizeof(cliaddr)); // 绑定地址 servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = INADDR_ANY; servaddr.sin_port = htons(8080); if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } socklen_t len; int n; len = sizeof(cliaddr); n = recvfrom(sockfd, (char *)buffer, 1024, MSG_WAITALL, (struct sockaddr *)&cliaddr, &len); buffer[n] = '