Socket实现服务器和客户端(手把手教会)

简介: Socket实现服务器和客户端(手把手教会)

Socket 编程是一种用于在网络上进行通信的编程方法,以下代码可以实现在不同主机之间传输数据。

Socket 编程中服务器端和客户端的基本步骤:

服务器端步骤:

1.创建 Socket:

int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
  • 使用 socket 函数创建一个套接字。
  • AF_INET 表示使用 IPv4 地址族。
  • SOCK_STREAM 表示使用 TCP 协议,如果使用 UDP,则为 SOCK_DGRAM。

2.绑定地址和端口:

   struct sockaddr_in serverAddress;
   serverAddress.sin_family = AF_INET;
   serverAddress.sin_addr.s_addr = INADDR_ANY;
   serverAddress.sin_port = htons(PORT);
 
   bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));
  • 初始化服务器地址结构体 sockaddr_in,设置 IP 地址和端口。
  • 使用 bind 函数将套接字绑定到指定的地址和端口。

3.监听连接请求:

listen(serverSocket, BACKLOG);
  • 使用 listen 函数开始监听连接请求。
  • BACKLOG 参数指定连接请求队列的最大长度。

4.接受客户端连接:

int clientSocket = accept(serverSocket, NULL, NULL);

使用 accept 函数接受客户端的连接请求。

返回一个新的套接字 clientSocket,用于与客户端通信。


5.接收和发送数据:

       使用 recv 函数从客户端接收数据,使用 send 函数向客户端发送数据。

关闭连接:

   close(clientSocket);
   close(serverSocket);

使用 close 函数关闭连接的套接字。

客户端步骤:

1. 创建 Socket:

int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
  • 使用 socket 函数创建一个套接字。
  • 设置服务器地址和端口:
   struct sockaddr_in serverAddress;
   serverAddress.sin_family = AF_INET;
   serverAddress.sin_addr.s_addr = inet_addr(SERVER_IP);
   serverAddress.sin_port = htons(PORT);
  • 初始化服务器地址结构体 sockaddr_in,设置服务器的 IP 地址和端口。
  • 连接到服务器:
connect(clientSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));
  • 使用 connect 函数连接到服务器。
  • 发送和接收数据:
  • 使用 send 函数向服务器发送数据,使用 recv 函数从服务器接收数据。
  • 关闭连接:
close(clientSocket);

使用 close 函数关闭连接的套接字。

解决分包、粘包问题

Socket实现模拟TCP通信粘包问题-CSDN博客

Client:

#include <iostream>
#include <string>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
 
int main(){
 
    //1.创建socket
    int client_sock=socket(AF_INET,SOCK_STREAM,0);
    if (client_sock==-1)
    {
        std::cerr<<"Faild to create socket"<<std::endl;
        return -1;
    }
 
    //2.连接服务器
 
    struct sockaddr_in server_addr;
    server_addr.sin_family=AF_INET;
    //server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
    inet_pton(AF_INET,"127.0.0.1",&server_addr.sin_addr.s_addr);
    server_addr.sin_port=htons(9999);
 
    if(connect(client_sock,(struct sockaddr*)&server_addr,sizeof(server_addr))==-1){
        std::cerr<<"Faild to connect socket"<<std::endl;
        return -1;
    }
 
    std::cout<<"Connected to server"<<std::endl;
 
    //3.数据交互
 
    //发送消息
    
    std::string msg="Hello server!\n";
 
    if(write(client_sock,msg.c_str(),msg.length())==-1){
        std::cerr<<"Faild to write "<<std::endl;
        return -1;
    }
 
    //接受消息
 
    char buffer[1024];
    if(read(client_sock,buffer,sizeof(buffer))==-1){
        std::cerr<<"Faild to read"<<std::endl;
        return -1;
    }
 
    printf("Receive to server :%s",buffer);
 
    close(client_sock);
    
 
}

Server:

#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>
 
int main(int, char**){
    //1.创建套接字
    int listen_sock=socket(AF_INET,SOCK_STREAM,0);
 
    if (listen_sock==-1)
    {
        std::cerr<<"Fiald to create socket"<<std::endl;
        return 1;
    }
    
 
    //2.绑定IP地址
    struct sockaddr_in server_addr;
    memset(&server_addr,0,sizeof(server_addr));
 
    server_addr.sin_addr.s_addr=INADDR_ANY;
    server_addr.sin_family=AF_INET;
    server_addr.sin_port=htons(9999);
 
    if(bind(listen_sock,(struct sockaddr*)&server_addr,sizeof(server_addr))==-1)
    {
        std::cerr<<"Fiald to bind socket"<<std::endl;
        return 1;
    }
    //3.监听套接字
 
    if (listen(listen_sock,5)==-1)
    {
        std::cerr<<"Fiald to listen socket"<<std::endl;
        return 1;
    }
    
    std::cout<<"server is listening"<<std::endl;
 
    //4.接受客户端的连接
 
    struct sockaddr_in client_addr;
    socklen_t client_addr_len=sizeof(client_addr);
 
    int client_sock=accept(listen_sock,(struct sockaddr*)&client_addr,&client_addr_len);
 
    if (client_sock==-1)
    {
        std::cerr<<"Fiald to accept socket"<<std::endl;
        return 1;
    }
    std::cout<<"a client connected"<<std::endl;
 
    //5.数据交互
    
    //接受消息
 
    char buffer[1024];
    int read_size=read(client_sock,buffer,sizeof(buffer));
    
    if (read_size==-1) 
    {
        std::cerr<<"Fiald to read"<<std::endl;
        return 1;
    }
    
 
    std::cout<<"Received to client :"<<buffer<<std::endl;
    std::string res_msg="Hello Client!";
    int wr=write(client_sock,res_msg.c_str(),res_msg.length());
 
    if (wr==-1)
    {
        std::cerr<<"Fiald to write"<<std::endl;
        return 1;
    }
    
 
    close(client_sock);
    close(listen_sock);
 
    
 
 
 
}
相关文章
|
10天前
|
存储 人工智能 自然语言处理
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
ChatMCP 是一款基于模型上下文协议(MCP)的 AI 聊天客户端,支持多语言和自动化安装。它能够与多种大型语言模型(LLM)如 OpenAI、Claude 和 OLLama 等进行交互,具备自动化安装 MCP 服务器、SSE 传输支持、自动选择服务器、聊天记录管理等功能。
78 15
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
|
1月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
40 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
2月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
168 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
2月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
175 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
2月前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
|
2月前
|
安全 区块链 数据库
|
6天前
|
弹性计算 运维 安全
阿里云轻量应用服务器与ECS的区别及选择指南
轻量应用服务器和云服务器ECS(Elastic Compute Service)是两款颇受欢迎的产品。本文将对这两者进行详细的对比,帮助用户更好地理解它们之间的区别,并根据自身需求做出明智的选择。
|
7天前
|
SQL 弹性计算 安全
阿里云上云优选与飞天加速计划活动区别及购买云服务器后续必做功课参考
对于很多用户来说,购买云服务器通常都是通过阿里云当下的各种活动来购买,这就有必要了解这些活动的区别,同时由于活动内的云服务器购买之后还需要单独购买并挂载数据盘,还需要设置远程密码以及安全组等操作之后才能正常使用云服务器。本文就为大家介绍一下目前比较热门的上云优选与飞天加速计划两个活动的区别,以及通过活动来购买云服务器之后的一些必做功课,确保云服务器可以正常使用,以供参考。
|
10天前
|
弹性计算 安全 开发工具
灵码评测-阿里云提供的ECS python3 sdk做安全组管理
批量变更阿里云ECS安全组策略(批量变更)
|
27天前
|
存储 人工智能 弹性计算
阿里云弹性计算(ECS)提供强大的AI工作负载平台,支持灵活的资源配置与高性能计算,适用于AI训练与推理
阿里云弹性计算(ECS)提供强大的AI工作负载平台,支持灵活的资源配置与高性能计算,适用于AI训练与推理。通过合理优化资源分配、利用自动伸缩及高效数据管理,ECS能显著提升AI系统的性能与效率,降低运营成本,助力科研与企业用户在AI领域取得突破。
47 6