推荐阅读:
[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编程的基本步骤,帮助读者快速掌握Linux环境下网络通信的核心技术。
本文目录导读:
Socket编程是计算机网络编程的基础,它允许程序在不同的计算机之间进行通信,无论是Web开发、网络通信还是嵌入式系统,Socket编程都是不可或缺的技术,本文将为您详细讲解Socket编程的基本概念、原理以及实践应用,帮助您快速入门。
Socket编程基础
1、Socket概念
Socket起源于UNIX操作系统,它是计算机网络通信的端点,可以看作是不同计算机之间进行数据传输的通道,Socket分为两种类型:面向连接的Socket和无连接的Socket,面向连接的Socket使用TCP协议,提供可靠的数据传输;无连接的Socket使用UDP协议,提供高效但不可靠的数据传输。
2、Socket函数
Socket编程主要涉及以下几个函数:
(1)socket():创建Socket。
(2)bind():将Socket绑定到指定地址和端口。
(3)listen():设置Socket为监听状态。
(4)accept():接收客户端连接请求。
(5)connect():连接到服务器端。
(6)send():发送数据。
(7)reCV():接收数据。
(8)close():关闭Socket。
3、地址族和协议族
地址族用于指定Socket使用的地址类型,如IPv4、IPv6等,协议族用于指定Socket使用的协议,如TCP、UDP等。
Socket编程实践
1、创建Socket
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("socket"); exit(EXIT_FAILURE); } printf("Socket created successfully. "); return 0; }
2、绑定Socket
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in servaddr; servaddr.sin_family = AF_INET; servaddr.sin_port = htons(8080); servaddr.sin_addr.s_addr = inet_addr("192.168.1.1"); if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) { perror("bind"); exit(EXIT_FAILURE); } printf("Socket bound successfully. "); return 0; }
3、监听Socket
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in servaddr; servaddr.sin_family = AF_INET; servaddr.sin_port = htons(8080); servaddr.sin_addr.s_addr = inet_addr("192.168.1.1"); if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) { perror("bind"); exit(EXIT_FAILURE); } if (listen(sockfd, 10) == -1) { perror("listen"); exit(EXIT_FAILURE); } printf("Socket listening... "); return 0; }
4、接受连接
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in servaddr, cliaddr; servaddr.sin_family = AF_INET; servaddr.sin_port = htons(8080); servaddr.sin_addr.s_addr = inet_addr("192.168.1.1"); if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) { perror("bind"); exit(EXIT_FAILURE); } if (listen(sockfd, 10) == -1) { perror("listen"); exit(EXIT_FAILURE); } int connfd = accept(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); if (connfd == -1) { perror("accept"); exit(EXIT_FAILURE); } printf("Connection accepted. "); return 0; }
5、发送和接收数据
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in servaddr, cliaddr; servaddr.sin_family = AF_INET; servaddr.sin_port = htons(8080); servaddr.sin_addr.s_addr = inet_addr("192.168.1.1"); if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) { perror("bind"); exit(EXIT_FAILURE); } if (listen(sockfd, 10) == -1) { perror("listen"); exit(EXIT_FAILURE); } int connfd = accept(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); if (connfd == -1) { perror("accept"); exit(EXIT_FAILURE); } char buffer[1024]; strcpy(buffer, "Hello, client!"); send(connfd, buffer, strlen(buffer), 0); printf("Data sent. "); int n = recv(connfd, buffer, sizeof(buffer), 0); buffer[n] = '