### 实战Linux Socket编程知识点概览 #### 一、Socket编程基础 **1.1 Socket概念简介** Socket是一种用于进程间通信的机制,它为不同主机间的进程提供了一种可靠的双向通信链路。在Linux环境下,Socket编程是实现网络应用程序的基础之一。 **1.2 Socket类型** - **流式套接字(SOCK_STREAM)**:提供面向连接的服务,基于TCP协议。 - **数据报套接字(SOCK_DGRAM)**:提供无连接的服务,基于UDP协议。 - **原始套接字(SOCK_RAW)**:可以发送和接收任何类型的IP数据包。 **1.3 Socket地址结构** - **AF_INET**:IPv4地址族。 - **AF_INET6**:IPv6地址族。 - **AF_UNIX**:本地进程间通信。 #### 二、创建Socket实例 **2.1 创建Socket** ```c #include <sys/socket.h> int socket(int domain, int type, int protocol); ``` - `domain`:指定地址族。 - `type`:指定套接字类型。 - `protocol`:通常设置为0表示默认协议。 **2.2 绑定Socket** ```c #include <sys/socket.h> int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); ``` - `sockfd`:Socket文件描述符。 - `addr`:指向地址结构的指针。 - `addrlen`:地址结构的长度。 **2.3 监听Socket** ```c #include <sys/socket.h> int listen(int sockfd, int backlog); ``` - `backlog`:指定等待队列的最大长度。 #### 三、服务器端Socket编程 **3.1 接受客户端连接** ```c #include <sys/socket.h> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); ``` **3.2 读写数据** - **read()** 和 **write()** - **recv()** 和 **send()** ```c ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); ssize_t recv(int sockfd, void *buf, size_t len, int flags); ssize_t send(int sockfd, const void *buf, size_t len, int flags); ``` **3.3 关闭Socket** ```c #include <unistd.h> int close(int fd); ``` #### 四、客户端Socket编程 **4.1 连接服务器** ```c #include <sys/socket.h> int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); ``` **4.2 发送与接收数据** - 使用 **send()** 和 **recv()** 函数。 #### 五、错误处理 **5.1 错误代码** - **EAGAIN** 或 **EWOULDBLOCK**:资源暂时不可用。 - **EINVAL**:无效参数。 - **ENOMEM**:内存不足。 - **EACCES**:权限问题。 **5.2 错误处理示例** ```c #include <stdio.h> #include <errno.h> if (connect(sockfd, &serv_addr, sizeof(serv_addr)) == -1) { perror("ERROR on connect"); exit(1); } ``` #### 六、高级主题 **6.1 非阻塞模式** 通过设置 **O_NONBLOCK** 标志将Socket设为非阻塞模式。 **6.2 超时设置** 使用 **setsockopt()** 设置读写超时。 **6.3 多线程/多进程** - 在多线程或多进程中处理多个客户端连接。 **6.4 安全性考虑** - 加密传输。 - 身份验证。 #### 七、示例代码分析 考虑到给定文件中的“缺页”部分并未提供具体章节或段落的信息,这里提供一个简单的服务器端和客户端示例来帮助理解: **7.1 服务器端示例** ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #define PORT 8080 int main() { int server_fd, new_socket; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[1024] = {0}; char *hello = "Hello from server"; // Creating socket file descriptor if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // Forcefully attaching socket to the port 8080 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // Forcefully attaching socket to the port 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\n"); return 0; } ``` **7.2 客户端示例** ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 8080 #define IP_ADDRESS "127.0.0.1" int main() { int sock = 0, valread; struct sockaddr_in serv_addr; char *hello = "Hello from client"; char buffer[1024] = {0}; // Create socket if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // Convert IPv4 and IPv6 addresses from text to binary form if(inet_pton(AF_INET, IP_ADDRESS, &serv_addr.sin_addr)<=0) { printf("\nInvalid address/ Address not supported \n"); return -1; } if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("\nConnection Failed \n"); return -1; } send(sock, hello, strlen(hello), 0); printf("Hello message sent\n"); valread = read(sock, buffer, 1024); printf("%s\n", buffer); return 0; } ``` 以上是对Linux Socket编程的基础介绍及实际应用示例。对于更深入的学习和实践,建议参考专业书籍如《UNIX Network Programming》等,以便掌握更多高级特性和技术细节。
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Java的简单文章管理系统设计源码
- 基于湖北商贸学院Java实习的资料汇总设计源码
- #Mitsubishi 三菱 PLC张力控制通用程序模板 采用三菱伺服FX3U的速度与力矩模式,收料采 用锥度与恒张力两种控制
- 基于Python实现的实用Windows CMD小命令集设计源码
- 基于Html+JavaScript+CSS+Java的母婴商城设计源码
- 77.潜龙出海副图选股.tn6
- The dataset for Nature Communications
- #Simulink #汽车级锂电池模型 均值模糊控制 MATLAB-simulink主动均衡电路模型 动力锂电池模组(16节
- 基于Html与Python的杨金秋组小组自动化合作设计源码
- L C型逆变器仿真, 控制方式选择电流闭环控制,调制方式为 svpwm 系统分别在 dq 坐标系下,状态方程下,传递函数下进行表
- 1
- 2
- 3
前往页