推荐阅读:
[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编程基础
1、Socket概念
Socket起源于Unix,是网络通信的端点,可以看作是不同计算机之间进行数据交换的通道,在Socket编程中,我们通常使用TCP(传输控制协议)和UDP(用户数据报协议)两种协议。
2、Socket类型
(1)流式Socket(TCP):提供可靠的、面向连接的服务,数据传输有序、无重复且无错误。
(2)数据报Socket(UDP):提供不可靠的、无连接的服务,数据传输可能有丢失、重复或顺序错误。
3、Socket地址
Socket地址用于标识网络中的Socket,包括IP地址和端口号,IP地址用于标识网络中的主机,端口号用于标识主机上的应用程序。
4、套接字API
套接字API是一组用于创建、发送、接收数据的函数,主要包括以下函数:
(1)socket():创建Socket。
(2)bind():将Socket绑定到地址。
(3)listen():设置Socket为监听模式。
(4)accept():接受连接请求。
(5)connect():发起连接请求。
(6)send():发送数据。
(7)recv():接收数据。
(8)close():关闭Socket。
Socket编程实践
1、TCP Socket编程
以下是一个简单的TCP Socket编程实例,包括服务器端和客户端:
(1)服务器端:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define PORT 8888 int main() { int server_fd, client_fd; struct sockaddr_in server_addr, client_addr; socklen_t client_addr_len = sizeof(client_addr); 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); } // 绑定地址 server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(PORT); if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听 if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } // 接受连接 if ((client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len)) < 0) { perror("accept"); exit(EXIT_FAILURE); } // 读取数据 read(client_fd, buffer, 1024); printf("Message from client: %s ", buffer); // 发送数据 send(client_fd, hello, strlen(hello), 0); printf("Hello message sent "); // 关闭Socket close(server_fd); close(client_fd); return 0; }
(2)客户端:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define PORT 8888 int main() { int sock; struct sockaddr_in server_addr; char buffer[1024] = {0}; const char *message = "Hello from client"; // 创建Socket if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf(" Socket creation error "); return -1; } // 设置服务器地址 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = INADDR_ANY; // 连接服务器 if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { printf(" Connection Failed "); return -1; } // 发送数据 send(sock, message, strlen(message), 0); printf("Message sent "); // 接收数据 read(sock, buffer, 1024); printf("Message from server: %s ", buffer); // 关闭Socket close(sock); return 0; }
2、UDP Socket编程
以下是一个简单的UDP Socket编程实例,包括服务器端和客户端:
(1)服务器端:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define PORT 8888 int main() { int server_fd; struct sockaddr_in server_addr, client_addr; socklen_t client_addr_len = sizeof(client_addr); char buffer[1024] = {0}; const char *hello = "Hello from server"; // 创建Socket if ((server_fd = socket(AF_INET, SOCK_DGRAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 绑定地址 server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(PORT); if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 接收数据 while (1) { int n = recvfrom(server_fd, (char *)buffer, 1024, 0, (struct sockaddr *)&client_addr, &client_addr_len); buffer[n] = '