推荐阅读:
[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编程是计算机网络编程的基础,它允许程序在不同的计算机之间进行通信,无论是客户端-服务器(C/S)模型还是对等网络(P2P)模型,Socket编程都发挥着至关重要的作用,本文将为您详细介绍Socket编程的基本概念、原理以及实战应用,帮助您快速入门。
Socket编程基础
1、Socket概念
Socket起源于UNIX操作系统,是一种用于实现进程间通信的抽象层,在网络编程中,Socket可以看作是不同计算机上的进程间通信的端点,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编程实例
下面通过一个简单的TCP Socket编程实例,来展示Socket的基本用法。
1、服务器端代码
#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 addrlen = sizeof(address); char buffer[1024] = {0}; 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(PORT); 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; }
2、客户端代码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #define PORT 8080 int main() { struct sockaddr_in address; int sock = 0, valread; struct sockaddr_in serv_addr; char *hello = "Hello from client"; char buffer[1024] = {0}; // 创建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(PORT); // 转换地址从文本到二进制 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; }
Socket编程进阶
1、非阻塞Socket
在默认情况下,Socket是阻塞的,这意味着在执行某些操作(如接收数据)时,如果条件不满足,程序会陷入等待状态,为了提高程序的效率,可以使用非阻塞Socket,通过设置Socket的属性,可以使Socket在条件不满足时立即返回,从而允许程序继续执行其他任务。
2、多线程Socket编程
在处理多个客户端时,可以使用多线程来提高程序的并发处理能力,在多线程Socket编程中,每个客户端连接都对应一个线程,这样服务器可以同时处理多个客户端的请求。
3、I/O多路复用
I/O多路复用是一种允许程序同时监视多个文件描述符的可读、可写和异常等事件的技术,通过使用I/O多路复用,程序可以在单个线程中处理多个Socket连接,从而提高资源利用率和程序性能。
Socket编程是计算机网络编程的基础,掌握Socket编程对于理解和开发网络应用程序至关重要,本文从Socket编程的基本概念、原理入手,通过一个简单的实例展示了Socket编程的基本用法,并简要介绍了Socket编程的进阶内容,希望这篇文章能帮助您快速入门Socket编程。
关键词:Socket编程,入门教程,基础概念,Socket类型,TCP,UDP,Socket函数,实例,服务器端,客户端,非阻塞Socket,多线程Socket编程,I/O多路复用,总结
本文标签属性:
Socket编程:Socket编程通常分为什么和什么
Linux环境:linux环境变量怎么看
Socket编程入门教程:sockets编程