这个只是拿来练手的,来简单实现一下,后续再考虑要不要在这个基础上进行更新迭代。
运用技术:
目前只是用到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,然后两个终端分别运行即可。
下次优化,自行进行输入输出。
1841

被折叠的 条评论
为什么被折叠?



