推荐阅读:
[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操作系统,是计算机网络通信的端点,它提供了进程间通信的一种机制,使得进程可以通过网络与其他进程进行数据交换。
2、Socket类型
Socket主要有两种类型:TCP(传输控制协议)和UDP(用户数据报协议),TCP是一种面向连接的、可靠的、基于字节流的传输层协议;UDP则是一种无连接的、不可靠的、基于数据报的传输层协议。
Socket编程基础
1、Socket函数
Socket编程涉及一系列函数,以下是一些常用的Socket函数:
- socket():创建Socket
- bind():绑定Socket到指定地址和端口
- listen():监听Socket
- accept():接受连接请求
- connect():发起连接请求
- send():发送数据
- reCV():接收数据
- close():关闭Socket
2、地址族和协议族
地址族用于指定Socket使用的地址类型,如IPv4、IPv6等,协议族则指定Socket使用的协议,如TCP、UDP等。
3、端口
端口是Socket通信的端点,用于区分不同的通信进程,端口号范围从0到65535,其中0到1023为系统端口,1024到49151为注册端口,49152到65535为动态端口。
Socket编程实践
1、TCP Socket编程
以下是一个简单的TCP Socket编程示例:
服务器端代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> int main() { int server_fd, new_socket; struct sockaddr_in address; 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 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 <netinet/in.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; } // 连接socket 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/socket.h> #include <netinet/in.h> int main() { int server_fd; struct sockaddr_in address; int addrlen = sizeof(address); char buffer[1024] = {0}; const char *hello = "Hello from server"; // 创建socket if ((server_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); } // 绑定socket 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); } // 接收数据 int n = recvfrom(server_fd, (char *)buffer, 1024, 0, (struct sockaddr *)&address, (socklen_t *)&addrlen); buffer[n] = '