套接字的使用

简介: 套接字的使用

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


目录
相关文章
|
5月前
|
网络协议 Java Unix
套接字(Socket)
套接字(Socket)
57 3
|
5月前
|
网络协议 数据库连接
套接字双向通信
套接字双向通信
47 5
|
5月前
套接字(socket)的端点表示
套接字(socket)的端点表示
60 8
|
12月前
|
存储
14.10 Socket 套接字选择通信
对于网络通信中的服务端来说,显然不可能是一对一的,我们所希望的是服务端启用一份则可以选择性的与特定一个客户端通信,而当不需要与客户端通信时,则只需要将该套接字挂到链表中存储并等待后续操作,套接字服务端通过多线程实现存储套接字和选择通信,可以提高服务端的并发性能,使其能够同时处理多个客户端的请求。在实际应用场景中,这种技术被广泛应用于网络编程、互联网应用等领域。在服务端启动时,创建套接字并进行绑定,然后开启一个线程(称为主线程)用于监听客户端的连接请求。主线程在接收到新的连接请求后,会将对应的套接字加入一个数据结构(例如链表、队列、哈希表等)中进行存储。同时,主线程会将存储套接字的数据结构传递给
38 1
14.10 Socket 套接字选择通信
|
12月前
|
存储 网络协议 Unix
网络基础:socket套接字
网络基础:socket套接字
81 0
|
4月前
|
网络协议 API
网络编程套接字(2)——Socket套接字
网络编程套接字(2)——Socket套接字
23 0
|
5月前
|
网络协议 Python
创建套接字
创建套接字
34 6
|
5月前
|
缓存 网络协议 API
套接字
Socket的连接 更准确来说是,流式Socket连接的相关内容 基本概述: TCP通信需要先建立虚拟链路(通信双方的一个连接,connection),TCP/IP通讯下,Socket采用四元组(源IP、源端口、目的IP、目的端口)标识(identity)
|
网络协议 Java API
|
5月前
|
网络协议 Java 程序员
网络编程套接字(Socket)
网络编程套接字(Socket)
51 0