套接字的使用

简介: 套接字的使用

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++套接字示例,用于在客户端和服务器之间进行文本消息的传输。服务器通过绑定地址和端口号,并监听连接请求。客户端连接到服务器后,可以输入消息并发送给服务器,服务器收到消息后进行回复,然后客户端再次收到服务器的响应。请根据需要进行修改和扩展,以适应特定的应用场景。记得编译并运行客户端和服务器端代码,并确保在同一网络环境中运行它们。


目录
相关文章
|
6月前
|
网络协议 Java Unix
套接字(Socket)
套接字(Socket)
70 3
|
6月前
|
网络协议 数据库连接
套接字双向通信
套接字双向通信
58 5
|
6月前
套接字(socket)的端点表示
套接字(socket)的端点表示
70 8
|
6月前
|
算法 Unix
socket套接字选项getsockopt&setsockopt
setsockopt()函数用于任意类型、任意状态套接口的设置选项值。尽管在不同协议层上存在选项,但本函数仅定义了最高的“套接口”层次上的选项。在Unix网络编程中通常用到getsockopt和setsockopt两个函数来获取和设置套接口的选项。getsockopt()函数用于获取任意类型、任意状态套接口的选项当前值,并把结果存入optval。
95 0
|
存储 网络协议 Unix
网络基础:socket套接字
网络基础:socket套接字
93 0
|
5月前
|
网络协议 API
网络编程套接字(2)——Socket套接字
网络编程套接字(2)——Socket套接字
31 0
|
6月前
|
网络协议 Python
创建套接字
创建套接字
35 6
|
网络协议 Java API
|
6月前
|
缓存 网络协议 API
套接字
Socket的连接 更准确来说是,流式Socket连接的相关内容 基本概述: TCP通信需要先建立虚拟链路(通信双方的一个连接,connection),TCP/IP通讯下,Socket采用四元组(源IP、源端口、目的IP、目的端口)标识(identity)
|
6月前
|
网络协议 Java 程序员
网络编程套接字(Socket)
网络编程套接字(Socket)
55 0