网络通信实战小项目:linux系统下实现服务端与客户端的通信

本文详细介绍了如何在C++中通过TCP/IP实现服务器端与客户端的网络通信,包括创建套接字、绑定端口、监听连接、接受请求等步骤,并提供了实际编写的代码示例。
摘要由CSDN通过智能技术生成

大家好,非常荣幸能和大家一起分享知识,今天我将和大家一起编写一个关于网络通信的实战小项目.在我的网络通信专栏中已经将网络通信的工作原理以及用到的所有需要了解的函数都一一进行了详细的讲解,今天的项目我将不再细致的阐述每个函数的功能及用法,如有不明白的地方,可以查看我的专栏或者直接评论区交流.好了废话不多说,直接上代码:

服务器端

首先我先和大家一起捋一下服务器端的实现流程:

(1)定义端口号和IP地址;

(2)使用socket函数创建套接字;

(3)使用bind函数绑定套接字和IP地址,端口号;

(4)使用listen函数监听连接服务器端口号的客户端;

(5)使用accept函数接受客户端的链连接请求.

sever.cpp

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<stdlib.h>
  
#define PORT 8080  //d定义端口号  
  
int main() {  
    int server_fd, new_socket;  
    struct sockaddr_in address;  
    int addrlen = sizeof(address);  
    char buffer[1024] = {0};  
    char hello[] = "Hello from server!";  
  
    // 创建套接字  
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {  
        perror("socket failed");  
        exit(EXIT_FAILURE);  
    }  
  
    // 绑定套接字到端口8080  
    address.sin_family = AF_INET;  
    address.sin_addr.s_addr = INADDR_ANY;  
    address.sin_port = htons(PORT);  
  
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {  
        perror("bind failed");  
        exit(EXIT_FAILURE);  
    }  
  
    // 监听连接请求  
    if (listen(server_fd, 3) < 0) {  
        perror("listen failed");  
        exit(EXIT_FAILURE);  
    }  
  
    printf("Server is listening on port %d...\n", PORT);  
  
    // 接受客户端连接请求并发送消息  
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {  
        perror("accept failed");  
        exit(EXIT_FAILURE);  
    }  
  
    send(new_socket, hello, strlen(hello), 0);  
    printf("Message sent to client: %s\n", hello);  
  
    // 接收客户端消息并回复  
    while (recv(new_socket, buffer, 1024, 0) > 0) {  
        printf("Client message: %s\n", buffer);  
        send(new_socket, buffer, strlen(buffer), 0);  
        printf("Message sent to client: %s\n", buffer);  
    }  
    close(new_socket);  
    close(server_fd);  
    return 0;  
}

客户端

客户端的实现流程:

(1)定义服务器的端口号和IP地址;

(2)使用socket函数创建套接字;

(3)使用connect函数连接服务器;

(4)发送数据

client.cpp

#include <iostream>  
#include <cstring> 
#include <sys/socket.h>  
#include <arpa/inet.h> 
#include <unistd.h> 
  
#define SERVER_IP "127.0.0.1" // 服务器的IP地址  
#define SERVER_PORT 8080      // 服务器的端口号  
#define BUFFER_SIZE 1024      // 接收消息的缓冲区大小  
  
int main() {  
    int sock = 0;  
    struct sockaddr_in serv_addr; // 服务器地址结构体  
    char message[] = "Hello from client!"; // 要发送的消息  
    char buffer[BUFFER_SIZE] = {0}; // 用于存储接收到的消息的缓冲区  
  
    // 创建套接字  
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {  
        std::cerr << "Socket creation error\n";  
        return -1;  
    }  
  
    // 设置服务器地址结构体  
    serv_addr.sin_family = AF_INET;  
    serv_addr.sin_port = htons(SERVER_PORT);  
  
    // 将IP地址从点分十进制转换为二进制形式  
    if (inet_pton(AF_INET, SERVER_IP, &serv_addr.sin_addr) <= 0) {  
        std::cerr << "Invalid address / Address not supported\n";  
        return -1;  
    }  
  
    // 连接到服务器  
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {  
        std::cerr << "Connection failed\n";  
        return -1;  
    }  
    std::cout << "Connected to server\n";  
  
    // 发送消息给服务器  
    if (send(sock, message, strlen(message), 0) < 0) {  
        std::cerr << "Send failed\n";  
        return -1;  
    }  
    std::cout << "Message sent to server: " << message << std::endl;  
  
    // 接收服务器的响应  
    int valread = read(sock, buffer, BUFFER_SIZE);  
    if (valread == -1) {  
        std::cerr << "Receive failed\n";  
        return -1;  
    }  
    std::cout << "Message received from server: " << buffer << std::endl;  
  
    // 关闭套接字  
    close(sock);  
    return 0;  
}

编写完程序后,我们需要在linux系统下打开两个终端,一个作为客户端,另一个作为服务端.

在服务端依次输入如下代码:

(1):cd到代码所在文件路径

cd /home/zhouweiqing/14/src

(2):编译服务器程序,命名为sever_out

g++ -o sever_out sever.cpp

(3):运行sever_out执行文件

./sever_out

在客户端依次输入如下代码:

 (1):cd到代码所在文件路径

cd /home/zhouweiqing/14/src

(2):编译服务器程序,命名为client_out

 g++ -o client_out client.cpp

(3):运行client_out执行文件

./client_out

得到结果如图所示:

/home/zhouweiqing/图片/2024-01-02 13-46-05 的屏幕截图.png

/home/zhouweiqing/图片/2024-01-02 13-46-15 的屏幕截图.png

可以看到客户端成功连接了端口号为8080的服务端,并互相进行了通信! 大功告成!

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值