基于Linux的TCP服务端客户端通信(一)

这个只是拿来练手的,来简单实现一下,后续再考虑要不要在这个基础上进行更新迭代。

运用技术:

目前只是用到socket编程socket()、bind()、listen()、accept()、send()、recv()等系统调用。

多线程的话考虑使用pthread库来进行处理多个客户端的连接。

下面将进行一步一步的实现,也作为我的一个记录。

首先要知道TCP的话是个面向连接的,所以需要connect这种来创建连接后再进行通信。

// 进入项目,初始化git
$ git init
// 查看本地文件有没有添加到git管理的
$ git status
// 本地仓库与远程仓库关联
$ git remote add origin ssh@
// 更新本地项目
$ git pull origin master
// 把内容先暂存到那个本地电脑暂存区
$ git add .
// 提交到本地仓库
$ git commit -m '注释信息'
// 强制覆盖前远程代码库为空,覆盖不会丢失代码
$ git push -u origin master -f

// 克隆仓库
$ git clone ssh@

首先是server.cpp文件代码内容:

#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>

int main() {
    // 创建 socket
    int server_sock = socket(AF_INET, SOCK_STREAM, 0);
    if (server_sock < 0) {
        std::cerr << "Socket creation failed" << std::endl;
        return 1;
    }

    // 服务器地址
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080);  // 端口号
    server_addr.sin_addr.s_addr = INADDR_ANY;  // 任意IP

    // 绑定 socket
    if (bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        std::cerr << "Bind failed" << std::endl;
        return 1;
    }

    // 开始监听连接
    if (listen(server_sock, 5) < 0) {
        std::cerr << "Listen failed" << std::endl;
        return 1;
    }

    std::cout << "Server is listening on port 8080..." << std::endl;

    // 接受客户端连接
    int client_sock;
    struct sockaddr_in client_addr;
    socklen_t client_len = sizeof(client_addr);
    client_sock = accept(server_sock, (struct sockaddr*)&client_addr, &client_len);
    if (client_sock < 0) {
        std::cerr << "Accept failed" << std::endl;
        return 1;
    }

    // 接收客户端消息
    char buffer[1024];
    int bytes_received = recv(client_sock, buffer, sizeof(buffer), 0);
    if (bytes_received < 0) {
        std::cerr << "Receive failed" << std::endl;
        return 1;
    }

    buffer[bytes_received] = '\0';  // Null 终止字符串
    std::cout << "Message from client: " << buffer << std::endl;

    // 回复客户端
    const char* message = "Hello from server!";
    send(client_sock, message, strlen(message), 0);

    // 关闭连接
    close(client_sock);
    close(server_sock);
    return 0;
}

下面是client.cpp代码内容

#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>

int main() {
    // 创建socket
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0) {
        std::cout << "Socket create failed" << std::endl;
        return 1;
    }

    // 服务器地址
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080);  // 端口号
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");  // 服务器IP

    // 连接到服务器
    if (connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        std::cerr << "Connection failed" << std::endl;
        return 1;
    }

    // 发送消息
    const char* message = "Hello Server!";
    send(sock, message, strlen(message), 0);
    std::cout << "Message sent to server: " << message << std::endl;

    // 接收服务器响应
    char buffer[1024];
    int bytes_received = recv(sock, buffer, sizeof(buffer), 0);
    if (bytes_received < 0) {
        std::cerr << "Receive failed" << std::endl;
        return 1;
    }

    buffer[bytes_received] = '\0';  // Null 终止字符串
    std::cout << "Message from server: " << buffer << std::endl;

    // 关闭连接
    close(sock);
    return 0;
}

需要写一个CMakeLists.txt来帮助编译

cmake_minimum_required(VERSION 3.10)

project(TcpComm)

set(CMAKE_CXX_STANDARD 11)

include_directories(${PROJECT_SOURCE_DIR}/src)

add_executable(client src/client.cpp)
add_executable(server src/server.cpp)

接下来步骤我直接写一起了

// 在项目根目录下面创建并进去build文件夹
mkdir build
cd build

// 使用cmake和make编译项目
cmake ..
make

这个时候build里会出现两个编译好的server和build,然后两个终端分别运行即可。

下次优化,自行进行输入输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值