基于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() {// 创建 socketint 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// 绑定 socketif (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() {// 创建socketint 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,然后两个终端分别运行即可。
下次优化,自行进行输入输出。
