推荐阅读:
[AI-人工智能]免翻墙的AI利器:樱桃茶·智域GPT,让你轻松使用ChatGPT和Midjourney - 免费AIGC工具 - 拼车/合租账号 八折优惠码: AIGCJOEDISCOUNT2024
[AI-人工智能]银河录像局: 国内可靠的AI工具与流媒体的合租平台 高效省钱、现号秒发、翻车赔偿、无限续费|95折优惠码: AIGCJOE
[AI-人工智能]免梯免翻墙-ChatGPT拼车站月卡 | 可用GPT4/GPT4o/o1-preview | 会话隔离 | 全网最低价独享体验ChatGPT/Claude会员服务
[AI-人工智能]边界AICHAT - 超级永久终身会员激活 史诗级神器,口碑炸裂!300万人都在用的AI平台
本文深入浅出地介绍了Linux操作系统下的网络编程基础,涵盖关键概念、API使用及编程实践。旨在为读者提供全面、系统的Linux网络编程教程,助力掌握网络通信核心知识。
本文目录导读:
Linux网络编程是计算机科学中的一个重要分支,主要研究如何在Linux操作系统上进行网络通信,本文将详细介绍Linux网络编程的基础知识,包括套接字编程、网络协议、IP地址和端口等关键概念。
套接字编程
1、套接字的定义
套接字(Socket)是网络通信过程中端点的抽象概念,可以看作是不同计算机进程间通信的通道,在Linux系统中,套接字是一种特殊的文件描述符,用于实现网络通信。
2、套接字的类型
Linux支持多种类型的套接字,主要包括以下几种:
(1)流式套接字(SOCK_STREAM):提供可靠的、面向连接的服务,数据传输顺序严格,适用于TCP协议。
(2)数据报套接字(SOCK_DGRAM):提供不可靠的、无连接的服务,数据传输顺序不严格,适用于UDP协议。
(3)原始套接字(SOCK_RAW):提供原始的网络协议接口,允许程序员直接操作IP层或更高层的协议。
3、套接字的创建
创建套接字需要使用socket()系统调用,其原型如下:
int socket(int domain, int type, int protocol);
domain参数指定通信域,如AF_INET表示IPv4网络;type参数指定套接字的类型;protocol参数指定使用的协议,如IPPROTO_TCP表示TCP协议。
4、套接字的绑定
绑定套接字需要使用bind()系统调用,其原型如下:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd参数为创建的套接字描述符;addr参数为指向地址结构的指针,用于指定本地地址;addrlen参数为地址结构的大小。
5、套接字的监听
监听套接字需要使用listen()系统调用,其原型如下:
int listen(int sockfd, int backlog);
sockfd参数为创建的套接字描述符;backlog参数表示最大同时连接数。
6、套接字的连接
连接套接字需要使用connect()系统调用,其原型如下:
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd参数为创建的套接字描述符;addr参数为指向地址结构的指针,用于指定远程地址;addrlen参数为地址结构的大小。
7、套接字的接收和发送
接收数据需要使用recv()或recvfrom()系统调用,发送数据需要使用send()或sendto()系统调用。
网络协议
1、TCP协议
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议,TCP协议通过三次握手建立连接,通过四次挥手断开连接。
2、UDP协议
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的、基于数据报的传输层协议,UDP协议不保证数据传输的可靠性,但传输速度快。
IP地址和端口
1、IP地址
IP地址是网络中设备的唯一标识符,用于标识网络中的主机,IPv4地址由32位二进制数组成,通常表示为四个十进制数,如192.168.1.1。
2、端口
端口是计算机上用于区分不同网络服务的逻辑接口,端口号范围为0-65535,其中0-1023为系统端口,1024-49151为用户端口,49152-65535为动态端口。
实例分析
下面以一个简单的TCP客户端和服务器程序为例,介绍Linux网络编程的基本流程。
1、服务器端
服务器端首先创建一个流式套接字,然后绑定本地地址和端口,接着监听连接请求,当收到客户端的连接请求时,服务器端接受连接,创建一个新的套接字用于与客户端通信。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int main() { int server_fd, new_socket; struct sockaddr_in address; int opt = 1; 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); } // 发送数据 send(new_socket, hello, strlen(hello), 0); printf("Hello message sent "); // 关闭套接字 close(server_fd); return 0; }
2、客户端
客户端创建一个流式套接字,然后连接到服务器端的地址和端口,连接成功后,客户端接收服务器端发送的数据,并打印出来。
#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; char buffer[1024] = {0}; const char *hello = "Hello from client"; // 创建套接字 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 "); // 接收数据 valread = read( sock , buffer, 1024); printf("%s ",buffer ); // 关闭套接字 close(sock); return 0; }
Linux网络编程是计算机科学中的一个重要领域,通过学习套接字编程、网络协议、IP地址和端口等基本概念,我们可以更好地理解和实现网络通信,掌握Linux网络编程基础,有助于我们在实际项目中高效地解决网络通信问题。
关键词:Linux网络编程, 套接字编程, 网络协议, IP地址, 端口, TCP, UDP, 创建套接字, 绑定地址, 监听连接, 接受连接, 发送数据, 接收数据, 实例分析, 服务器端, 客户端, 三次握手, 四次挥手, 可靠传输, 不可靠传输, 数据报, 字节流, 系统调用, 网络通信, 计算机网络, 传输层, 网络编程基础, 网络编程入门, 网络编程教程, Linux系统编程, Linux网络编程实战, Linux网络编程示例, Linux网络编程应用, Linux网络编程技巧, Linux网络编程指南, Linux网络编程书籍, Linux网络编程学习, Linux网络编程资源, Linux网络编程教程, Linux网络编程实战演练, Linux网络编程案例, Linux网络编程项目, Linux网络编程开发, Linux网络编程工具, Linux网络编程库, Linux网络编程框架, Linux网络编程编程语言, Linux网络编程编程技巧, Linux网络编程编程指南, Linux网络编程编程实践, Linux网络编程编程书籍, Linux网络编程编程资源, Linux网络编程编程教程, Linux网络编程编程实战, Linux网络编程编程示例, Linux网络编程编程应用, Linux网络编程编程技巧, Linux网络编程编程工具, Linux网络编程编程库, Linux网络编程编程框架, Linux网络编程编程语言, Linux网络编程编程指南, Linux网络编程编程实践, Linux网络编程编程书籍, Linux网络编程编程资源, Linux网络编程编程教程, Linux网络编程编程实战演练, Linux网络编程编程案例, Linux网络编程编程项目, Linux网络编程编程开发
本文标签属性:
Linux网络编程基础:linuxc++网络编程