套接字的使用

简介: 套接字的使用

f4100da8192f4cb0a852e271460d3829.png

套接字(Socket)是计算机网络中用于进行网络通信的一种机制。它可以用于在不同主机之间或同一主机的不同进程之间传输数据。


套接字提供了一种统一的接口,使得应用程序能够通过网络进行数据传输。在网络通信中,套接字通常使用TCP或UDP协议进行通信。


套接字操作包括创建、绑定、监听、连接、发送和接收等操作。创建套接字时,需要指定套接字的类型(如面向连接的套接字和面向消息的套接字)以及使用的协议(如TCP或UDP)。绑定套接字时,需要指定套接字的地址和端口号。监听套接字用于接受客户端的连接请求。连接套接字用于与服务器建立连接。发送和接收操作则用于在连接建立后进行数据的传输。


套接字实现了网络通信的底层细节,使得开发者可以方便地进行网络编程。在实际应用中,套接字被广泛应用于各种网络应用程序,如网页浏览器、邮件客户端、文件传输工具等。


实例:


这是一个基本的Python套接字(socket)的示例,用于创建客户端和服务器之间的简单通信:服务器端代码:

//python
import socket
# 创建套接字对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定服务器地址和端口号
server_address = ('localhost', 8080)
server_socket.bind(server_address)
# 监听连接请求
server_socket.listen(1)
print('服务器启动,等待客户端连接...')
# 接受客户端连接
client_socket, client_address = server_socket.accept()
print('客户端已连接:', client_address)
while True:
    # 接收客户端发送的数据
    data = client_socket.recv(1024).decode()
    if not data:
        break
    print('收到客户端消息:', data)
    # 发送响应给客户端
    response = '已收到消息:' + data
    client_socket.send(response.encode())
# 关闭连接
client_socket.close()
server_socket.close()
```
客户端代码:
```python
import socket
# 创建套接字对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 指定服务器地址和端口号
server_address = ('localhost', 8080)
# 连接服务器
client_socket.connect(server_address)
while True:
    message = input('请输入要发送的消息(输入 q 退出):')
    if message == 'q':
        break
    # 发送消息给服务器
    client_socket.send(message.encode())
    # 接收服务器响应
    response = client_socket.recv(1024).decode()
    print('收到服务器响应:', response)
# 关闭连接
client_socket.close()

这是一个简单的基于TCP协议的套接字示例,用于在客户端和服务器之间进行文本消息的传输。服务器通过绑定地址和端口号,并监听连接请求。客户端连接到服务器后,可以输入消息并发送给服务器,服务器收到消息后进行回复,然后客户端再次收到服务器的响应。请根据需要进行修改和扩展,以适应特定的应用场景。


#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
    int serverSocket, newSocket, valRead;
    struct sockaddr_in address{};
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};
    const char* response = "已收到消息:";
    // 创建套接字文件描述符
    if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        std::cerr << "套接字创建失败" << std::endl;
        return -1;
    }
    // 设置套接字选项,允许地址和端口重用
    if (setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
        std::cerr << "设置套接字选项失败" << std::endl;
        return -1;
    }
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);
    // 绑定服务器地址和端口号
    if (bind(serverSocket, (struct sockaddr *)&address, sizeof(address))<0) {
        std::cerr << "绑定地址失败" << std::endl;
        return -1;
    }
    // 监听连接请求
    if (listen(serverSocket, 3) < 0) {
        std::cerr << "监听失败" << std::endl;
        return -1;
    }
    std::cout << "服务器启动,等待客户端连接..." << std::endl;
    // 接受客户端连接
    if ((newSocket = accept(serverSocket, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        std::cerr << "接受客户端连接失败" << std::endl;
        return -1;
    }
    std::cout << "客户端已连接:" << inet_ntoa(address.sin_addr) << ":" << ntohs(address.sin_port) << std::endl;
    while (true) {
        // 接收客户端发送的数据
        valRead = read(newSocket, buffer, 1024);
        if (valRead <= 0)
            break;
        std::cout << "收到客户端消息:" << buffer << std::endl;
        // 发送响应给客户端
        send(newSocket, response, strlen(response), 0);
        memset(buffer, 0, sizeof(buffer));
    }
    // 关闭连接
    close(newSocket);
    close(serverSocket);
    return 0;
}
```
客户端代码:
```cpp
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
    int clientSocket = 0;
    struct sockaddr_in serv_addr{};
    char buffer[1024] = {0};
    const char* message;
    // 创建套接字文件描述符
    if ((clientSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        std::cerr << "套接字创建失败" << std::endl;
        return -1;
    }
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);
    // 将IP地址从字符串转换为二进制形式
    if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {
        std::cerr << "无效的地址/地址不支持" << std::endl;
        return -1;
    }
    // 连接服务器
    if (connect(clientSocket, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        std::cerr << "连接服务器失败" << std::endl;
        return -1;
    }
    while (true) {
        std::cout << "请输入要发送的消息(输入 q 退出):";
        std::cin.getline(buffer, sizeof(buffer));
        if (strcmp(buffer, "q") == 0)
            break;
        // 发送消息给服务器
        send(clientSocket, buffer, strlen(buffer), 0);
        // 接收服务器响应
        memset(buffer, 0, sizeof(buffer));
        read(clientSocket, buffer, 1024);
        std::cout << "收到服务器响应:" << buffer << std::endl;
    }
    // 关闭连接
    close(clientSocket);
    return 0;
}
//这是一个简单的使用TCP协议的C++套接字示例,用于在客户端和服务器之间进行文本消息的传输。服务器通过绑定地址和端口号,并监听连接请求。客户端连接到服务器后,可以输入消息并发送给服务器,服务器收到消息后进行回复,然后客户端再次收到服务器的响应。请根据需要进行修改和扩展,以适应特定的应用场景。记得编译并运行客户端和服务器端代码,并确保在同一网络环境中运行它们。


目录
相关文章
|
运维 Serverless Nacos
nacos常见问题之连接异常如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
723 0
nacos常见问题之连接异常如何解决
|
缓存 监控 Unix
vmstat命令详解
`vmstat` 是类 Unix 系统的监控工具,显示虚拟内存、物理内存、CPU、I/O 和系统中断等资源使用情况。基本用法是 `vmstat [interval [count]]`,可按指定时间间隔输出系统状态。主要字段包括进程(r/b)、内存(swpd/free/buff/cache)、交换(si/so)、I/O(bi/bo)、系统(in/cs)和CPU(us/sy/id/wa/st)的统计。使用 `-s`, `-a`, `-m`, `-d`, `-p` 等选项可获取不同类型的统计信息。详细信息可通过 `man vmstat` 查看。
318 3
|
Java 数据库连接
什么是双亲委派?如何打破双亲委派?
什么是双亲委派?如何打破双亲委派?
320 0
|
Java Spring 容器
什么是Spring Boot插件化开发?如何进行?
什么是Spring Boot插件化开发?如何进行?
1263 0
|
druid 数据库
几行代码轻松复现druid连接泄露的BUG之keepalive
几行代码轻松复现druid连接泄露的BUG之keepalive
1385 6
|
存储 网络协议 Unix
网络基础:socket套接字
网络基础:socket套接字
393 1
|
4月前
|
SQL 算法 关系型数据库
什么是 ‘小表驱动大表’ 原则?如何实现 JOIN顺序优化?(图解+秒懂+史上最全)
什么是 ‘小表驱动大表’ 原则?如何实现 JOIN顺序优化?(图解+秒懂+史上最全)
什么是 ‘小表驱动大表’ 原则?如何实现 JOIN顺序优化?(图解+秒懂+史上最全)
|
8月前
|
算法 数据安全/隐私保护
基于GARCH-Copula-CVaR模型的金融系统性风险溢出效应matlab模拟仿真
本程序基于GARCH-Copula-CVaR模型,使用MATLAB2022A仿真金融系统性风险溢出效应。核心功能包括计算违约点、资产价值波动率、信用溢价及其直方图等指标。GARCH模型用于描述资产收益波动性,Copula捕捉依赖结构,CVaR度量极端风险。完整代码无水印输出。 具体步骤:首先通过GARCH模型估计单个资产的波动性,再利用Copula方法构建多资产联合分布,最后应用CVaR评估系统性风险。程序展示了详细的运行结果和图表分析,适用于金融市场风险量化研究。
2022年超详细如何使用Xftp连接CentOS 7来进行文件的传输【详细过程、图解】
这篇文章提供了使用Xftp工具连接到CentOS 7虚拟机进行文件传输的详细步骤和图解。步骤包括打开Xftp软件、创建新连接、查看并填写虚拟机的IP地址、输入虚拟机的连接账号密码,以及连接成功后进行文件传输。文章最后以"现场手撸、学无止境"作为结束语,鼓励读者不断学习和实践。
|
存储 分布式计算 资源调度
Hadoop入门(一篇就够了)(上)
Hadoop入门(一篇就够了)(上)
736 0