推荐阅读:
[AI-人工智能]免翻墙的AI利器:樱桃茶·智域GPT,让你轻松使用ChatGPT和Midjourney - 免费AIGC工具 - 拼车/合租账号 八折优惠码: AIGCJOEDISCOUNT2024
[AI-人工智能]银河录像局: 国内可靠的AI工具与流媒体的合租平台 高效省钱、现号秒发、翻车赔偿、无限续费|95折优惠码: AIGCJOE
[AI-人工智能]免梯免翻墙-ChatGPT拼车站月卡 | 可用GPT4/GPT4o/o1-preview | 会话隔离 | 全网最低价独享体验ChatGPT/Claude会员服务
[AI-人工智能]边界AICHAT - 超级永久终身会员激活 史诗级神器,口碑炸裂!300万人都在用的AI平台
本文介绍了Linux操作系统下Socket编程的基础知识和实践步骤,包括Socket编程的基本概念、基本步骤以及相关实践操作,旨在帮助读者从入门到掌握Socket编程的核心技巧。
本文目录导读:
Socket编程是计算机网络编程中非常重要的一部分,它为网络通信提供了基础,通过Socket编程,我们可以实现不同主机之间的数据传输,本文将为你详细介绍Socket编程的基础知识,帮助初学者快速入门。
Socket编程基础
1、Socket概念
Socket起源于UNIX操作系统,它被定义为“一个通信端点”,在网络通信过程中,Socket负责数据的发送和接收,在TCP/IP协议中,Socket可以看作是IP地址和端口号的组合。
2、Socket类型
Socket编程中有两种主要的Socket类型:TCP(传输控制协议)和UDP(用户数据报协议)。
- TCP:提供可靠的、面向连接的服务,在TCP通信过程中,数据包按照顺序传输,且每个数据包都会被确认,适用于对数据可靠性要求较高的场景。
- UDP:提供不可靠的、无连接的服务,在UDP通信过程中,数据包可能丢失或重复,且不保证顺序,适用于对数据实时性要求较高的场景。
3、Socket函数
Socket编程涉及以下几个主要函数:
- socket():创建Socket。
- bind():将Socket绑定到指定的IP地址和端口号。
- listen():设置Socket为监听模式,等待客户端连接。
- accept():接收客户端的连接请求。
- connect():连接到指定的服务器。
- send():发送数据。
- reCV():接收数据。
- close():关闭Socket。
Socket编程实践
1、TCP Socket编程示例
以下是一个简单的TCP Socket编程示例,包括服务器端和客户端。
服务器端代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.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"; // 创建socket文件描述符 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 绑定socket到指定的IP地址和端口号 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 "); // 关闭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() { struct sockaddr_in address; int sock = 0, valread; struct sockaddr_in serv_addr; char buffer[1024] = {0}; const char* hello = "Hello from client"; // 创建socket文件描述符 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("message from server: %s ", buffer); // 关闭socket close(sock); return 0; }
2、UDP Socket编程示例
以下是一个简单的UDP Socket编程示例,包括服务器端和客户端。
服务器端代码:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 8080 #define BUFFER_SIZE 1024 int main() { int sockfd; char buffer[BUFFER_SIZE] = {0}; struct sockaddr_in servaddr, cliaddr; // 创建socket文件描述符 if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); } servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = INADDR_ANY; servaddr.sin_port = htons(PORT); // 绑定socket到指定的IP地址和端口号 if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } struct sockaddr_in cliaddr; int len = sizeof(cliaddr); // 接收客户端数据 int n = recvfrom(sockfd, (char *)buffer, BUFFER_SIZE, MSG_WAITALL, (struct sockaddr *)&cliaddr, &len); buffer[n] = '