推荐阅读:
[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起源于UNIX操作系统,但随着网络技术的发展,Socket编程已经成为了各种操作系统和编程语言中普遍支持的特性,本文将为您介绍Socket编程的基础知识,并通过实例帮助您快速入门。
Socket基础概念
1、Socket
Socket是计算机网络中的一个端点,可以看作是不同计算机上的进程间通信的一个通道,在UNIX系统中,Socket可以看作是一个特殊的文件,用于进程间的通信。
2、端口(Port)
端口是Socket通信中用于区分不同进程的逻辑标识符,每个Socket都会绑定一个端口号,用于网络通信,端口号范围是0~65535,其中0~1023为系统保留端口。
3、地址族(Address Family)
地址族用于指定Socket使用的网络协议族,常见的地址族有IPv4和IPv6,IPv4使用32位地址,而IPv6使用128位地址。
4、传输协议(Transport Protocol)
传输协议定义了Socket通信过程中数据传输的方式,常见的传输协议有TCP(传输控制协议)和UDP(用户数据报协议)。
Socket编程步骤
Socket编程分为服务器端和客户端两个部分,下面分别介绍服务器端和客户端的Socket编程步骤。
1、服务器端
(1)创建Socket
int socket(int domain, int type, int protocol);
domain:地址族,如AF_INET(IPv4)、AF_INET6(IPv6)等。
type:传输协议类型,如SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)等。
protocol:传输协议,通常设置为0,由系统自动选择。
(2)绑定地址
int bind(int sock, const struct sockaddr *addr, socklen_t len);
sock:创建的Socket。
addr:指向地址结构的指针,包含IP地址和端口号。
len:地址结构的长度。
(3)监听
int listen(int sock, int backlog);
sock:创建的Socket。
backlog:允许的最大连接数。
(4)接受连接
int accept(int sock, struct sockaddr *addr, socklen_t *len);
sock:创建的Socket。
addr:指向地址结构的指针,用于保存客户端地址。
len:地址结构的长度。
(5)发送数据
int send(int sock, const void *data, size_t size, int flags);
sock:创建的Socket。
data:发送数据的指针。
size:发送数据的长度。
flags:发送标志,通常设置为0。
(6)接收数据
int recv(int sock, void *data, size_t size, int flags);
sock:创建的Socket。
data:接收数据的指针。
size:接收数据的长度。
flags:接收标志,通常设置为0。
(7)关闭连接
int close(int sock);
sock:创建的Socket。
2、客户端
(1)创建Socket
int socket(int domain, int type, int protocol);
与服务器端相同。
(2)连接服务器
int connect(int sock, const struct sockaddr *addr, socklen_t len);
sock:创建的Socket。
addr:指向服务器地址结构的指针。
len:地址结构的长度。
(3)发送数据
int send(int sock, const void *data, size_t size, int flags);
与服务器端相同。
(4)接收数据
int recv(int sock, void *data, size_t size, int flags);
与服务器端相同。
(5)关闭连接
int close(int sock);
与服务器端相同。
实例
下面提供一个简单的TCP Socket编程实例,实现客户端和服务器端的通信。
1、服务器端
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> int main() { int serv_sock, clnt_sock; struct sockaddr_in serv_addr, clnt_addr; socklen_t clnt_addr_size; serv_sock = socket(AF_INET, SOCK_STREAM, 0); if (serv_sock == -1) { perror("socket"); exit(1); } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(12345); if (bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) { perror("bind"); exit(1); } if (listen(serv_sock, 5) == -1) { perror("listen"); exit(1); } printf("Server is running... "); clnt_addr_size = sizeof(clnt_addr); clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size); if (clnt_sock == -1) { perror("accept"); exit(1); } char buffer[1024]; while (1) { int str_len = recv(clnt_sock, buffer, sizeof(buffer) - 1, 0); if (str_len == 0) { printf("Client disconnected "); break; } buffer[str_len] = '