Socket实现服务器和客户端

发布时间:2024年01月23日

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);

    



}

文章来源:https://blog.csdn.net/festaw/article/details/135730849
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。