在Linux系统中实现Socket编程,主要涉及到套接字(Socket)的创建、绑定、监听、连接、数据传输和关闭等步骤,以下是对Socket linux实现的详细介绍:
Socket概念
Socket是应用层与传输层之间的接口,通过它可以在网络上进行进程间通信,在Linux中,Socket是通过文件描述符来表示的,可以像文件一样进行读写操作。
Socket通信模型
Socket通信通常基于客户端-服务器模型,包括TCP和UDP两种主要的通信协议。
1、TCP(Transmission Control Protocol):面向连接的可靠通信协议,通过三次握手建立连接,确保通信双方准备好进行数据交换,并在传输结束后执行四次挥手断开连接,保证资源的正确释放。
2、UDP(User Datagram Protocol):无连接的通信协议,速度快但不可靠,不提供复杂的错误检测和纠正机制。
Socket编程步骤
1、创建Socket:使用socket()
系统调用创建一个Socket。
2、绑定Socket:使用bind()
将Socket绑定到一个地址和端口。
3、监听连接(仅适用于TCP):使用listen()
开始监听连接请求。
4、接受连接(仅适用于TCP):使用accept()
接受客户端的连接请求。
5、建立连接:客户端使用connect()
连接到服务器端。
6、发送和接收数据:使用send()
和recv()
发送和接收数据。
7、关闭连接:使用close()
关闭连接。
Socket编程接口
在Linux中,Socket编程主要使用C语言的Socket编程接口,包括socket()
、bind()
、listen()
、accept()
、connect()
、send()
、recv()
等函数。
Socket文件描述符
在Linux中,Socket被视为一种文件描述符,可以像文件一样进行读写操作。
Socket编程实例
以下是一个简单的基于TCP的Socket通信的客户端-服务器模型的Socket通信示例:
服务器端代码示例:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #define MAXLINE 80 #define SERV_PORT 8000 int main(void) { struct sockaddr_in servaddr, cliaddr; socklen_t cliaddr_len; int listenfd, connfd; char buf[MAXLINE]; char str[INET_ADDRSTRLEN]; int i, n; // socket() 打开一个网络通讯端口,如果成功的话,就像 open() 一样返回一个文件描述符 listenfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); // bind() 的作用是将参数 listenfd 和 servaddr 绑定在一起,使 listenfd 这个用于网络通讯的文件描述符监听 servaddr 所描述的地址和端口号 bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); // listen() 声明 listenfd 处于监听状态,最多允许有 20 个客户端处于连接待状态,如果接收到更多的连接请求就忽略 listen(listenfd, 20); printf("Accepting connections ... "); while (1) { cliaddr_len = sizeof(cliaddr); // accept() 返回并接受这个连接,尚未 accept 的客户端就处于连接等待状态 connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len); n = read(connfd, buf, MAXLINE); printf("received from %s at PORT %d ", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port)); for (i = 0; i < n; i++) { buf[i] = toupper(buf[i]); } write(connfd, buf, n); close(connfd); } }
客户端代码示例:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #define MAXLINE 80 #define SERVADDR "127.0.0.1" #define SERVPORT 8000 int main(void) { struct sockaddr_in servaddr; int sockfd; char sendline[MAXLINE], recvline[MAXLINE]; socklen_t len; // socket() 创建一个套接字,类型为流式套接字,协议为默认的 TCP 协议 sockfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERVPORT); inet_pton(AF_INET, SERVADDR, &servaddr.sin_addr); // connect() 主动与服务器建立连接 connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); while (fgets(sendline, MAXLINE, stdin) != NULL) { write(sockfd, sendline, strlen(sendline)); //write() 向套接字写入数据,即发送数据给服务器 bzero(recvline, MAXLINE); read(sockfd, recvline, MAXLINE); //read() 从套接字读取数据,即接收来自服务器的数据 fputs(recvline, stdout); } close(sockfd); //close() 关闭套接字,释放资源 }
编译和运行
1、编译服务器端代码:gcc server.c -o server
2、编译客户端代码:gcc client.c -o client
3、启动服务器:./server
4、启动客户端:./client
示例展示了一个简单的基于TCP的Socket通信的客户端-服务器模型,通过这些代码,你可以理解如何在Linux系统上使用Socket编程实现网络通信,在实际应用中,你可以根据需求扩展和修改这些代码来满足特定的通信需求。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1257615.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复