Modified.

This commit is contained in:
Saturneric 2020-11-24 14:39:43 +08:00
parent 834500c0c4
commit 2d15bc935e
10 changed files with 123 additions and 38 deletions

View File

@ -6,6 +6,17 @@ set(CMAKE_CXX_STANDARD 14)
include_directories(include/) include_directories(include/)
include_directories(utils/) include_directories(utils/)
IF (WIN32)
ELSEIF (APPLE)
set(OPENSSL_ROOT_DIR /usr/local/opt/openssl@1.1)
set(OPENSSL_LIBRARIES /usr/local/opt/openssl@1.1/lib)
ELSEIF (UNIX)
ENDIF ()
find_package(Boost REQUIRED thread) find_package(Boost REQUIRED thread)
find_package(OpenSSL 1.1.1 REQUIRED) find_package(OpenSSL 1.1.1 REQUIRED)

13
include/communicate/tcp.h Normal file
View File

@ -0,0 +1,13 @@
//
// Created by 胡宇 on 2020/10/23.
//
#ifndef NET_TCP_H
#define NET_TCP_H
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#endif //NET_TCP_H

View File

@ -5,29 +5,28 @@
#ifndef NET_TCP_CLIENT_H #ifndef NET_TCP_CLIENT_H
#define NET_TCP_CLIENT_H #define NET_TCP_CLIENT_H
#include <cstring> #include <project.h>
#include <string>
#include <stdexcept>
#include <sstream>
#include <sys/types.h> #include "tcp.h"
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <boost/thread/thread.hpp>
namespace Net { namespace Net {
class TCPClient { class TCPClient {
public: public:
TCPClient(const std::string &ip, int port); TCPClient(const std::string &ip, int port);
~TCPClient(){
close(fd);
}
int sendData(const std::string &data); int sendData(const std::string &data);
private: private:
int fd{}; int fd{};
struct sockaddr_in client_addr{}; struct sockaddr_in client_addr{};
std::stringstream recv_buff; std::stringstream recv_buff;

View File

@ -5,21 +5,12 @@
#ifndef NET_TCP_SERVER_H #ifndef NET_TCP_SERVER_H
#define NET_TCP_SERVER_H #define NET_TCP_SERVER_H
#include <stdexcept>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <sstream>
#include <string>
#include <queue>
#include <sys/types.h> // 基础依赖
#include <sys/socket.h> #include <project.h>
#include <netinet/in.h>
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
// 扩展依赖
#include "tcp.h"
namespace Net { namespace Net {
@ -41,6 +32,7 @@ namespace Net {
uint8_t readByte(); uint8_t readByte();
private: private:
int fd; int fd;
int status = 0; int status = 0;
struct sockaddr_in server_addr; struct sockaddr_in server_addr;

View File

@ -0,0 +1,27 @@
//
// Created by 胡宇 on 2020/10/23.
//
#ifndef NET_TCP_SESSION_H
#define NET_TCP_SESSION_H
// 基础依赖
#include <project.h>
// 扩展依赖
#include "tcp.h"
class TCPSession {
public:
TCPSession(){
}
private:
};
#endif //NET_TCP_SESSION_H

31
include/project.h Normal file
View File

@ -0,0 +1,31 @@
//
// Created by 胡宇 on 2020/10/23.
//
#ifndef NET_PROJECT_H
#define NET_PROJECT_H
// 基础
#include <cerrno>
#include <cstdio>
#include <cstdlib>
#include <cstdint>
// 基本
#include <stdexcept>
#include <cstdlib>
#include <cstring>
// 流
#include <sstream>
// 数据结构
#include <vector>
#include <string>
#include <queue>
// 高级组件
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#endif //NET_PROJECT_H

View File

@ -4,6 +4,8 @@
#include "communicate/tcp_client.h" #include "communicate/tcp_client.h"
extern int errno;
void Net::TCPClient::recv_data(Net::TCPClient *client) { void Net::TCPClient::recv_data(Net::TCPClient *client) {
u_char buff[1024]; u_char buff[1024];
int len; int len;
@ -13,16 +15,18 @@ void Net::TCPClient::recv_data(Net::TCPClient *client) {
} }
void Net::TCPClient::recv_cycle() { void Net::TCPClient::recv_cycle() {
boost::thread recv_thread(TCPClient::recv_data, boost::thread recv_thread(TCPClient::recv_data,this);
this);
recv_thread.detach(); recv_thread.detach();
} }
void Net::TCPClient::create_socket_and_connection() { void Net::TCPClient::create_socket_and_connection() {
if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
throw std::runtime_error("create socket failed."); throw std::runtime_error(strerror(errno));
} }
connect(fd, (struct sockaddr *) &client_addr, sizeof(client_addr)); if(connect(fd, (struct sockaddr *) &client_addr, sizeof(client_addr)) < 0){
throw std::runtime_error(strerror(errno));
}
} }
int Net::TCPClient::sendData(const std::string &data) { int Net::TCPClient::sendData(const std::string &data) {

View File

@ -5,6 +5,8 @@
#include "debug_tools/print_tools.h" #include "debug_tools/print_tools.h"
#include "communicate/tcp_server.h" #include "communicate/tcp_server.h"
extern int errno;
void Net::TCPServer::cycle() { void Net::TCPServer::cycle() {
boost::thread accept_manager_thread(TCPServer::accept_manager, this); boost::thread accept_manager_thread(TCPServer::accept_manager, this);
this->p_accept_manager_thread = &accept_manager_thread; this->p_accept_manager_thread = &accept_manager_thread;
@ -17,7 +19,7 @@ void Net::TCPServer::accept_manager(Net::TCPServer *server) {
int connect_fd = ::accept(server->fd, nullptr, nullptr); int connect_fd = ::accept(server->fd, nullptr, nullptr);
Net::PrintTools::debugPrintSuccess("New Connection."); Net::PrintTools::debugPrintSuccess("New Connection.");
if(connect_fd == -1) throw std::runtime_error("accept tcp connection error"); if(connect_fd < 0) throw std::runtime_error(strerror(errno));
else{ else{
boost::thread accept_thread(TCPServer::accept, connect_fd, &server->buff_mutex, &server->recv_buff, &server->status); boost::thread accept_thread(TCPServer::accept, connect_fd, &server->buff_mutex, &server->recv_buff, &server->status);
accept_thread.detach(); accept_thread.detach();
@ -45,24 +47,24 @@ void Net::TCPServer::accept(int fd, boost::mutex *buff_mutex, std::queue<uint8_t
} }
void Net::TCPServer::create_socket(int port) { void Net::TCPServer::create_socket(int port) {
fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) throw std::runtime_error(strerror(errno));
if(!~fd) throw std::runtime_error("could not create socket file.");
std::memset(&server_addr, 0, sizeof(struct sockaddr_in)); std::memset(&server_addr, 0, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET; this->server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); this->server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(port); this->server_addr.sin_port = htons(port);
} }
Net::TCPServer::TCPServer(int port, int max_connection) { Net::TCPServer::TCPServer(int port, int max_connection) {
// 创建 socket
create_socket(port); create_socket(port);
if(bind(fd, (struct sockaddr *) &server_addr, sizeof(server_addr)) == -1) if(bind(fd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0)
throw std::runtime_error("bind port failed."); throw std::runtime_error(strerror(errno));
if(listen(fd, max_connection) == -1) if(listen(fd, max_connection) < 0)
throw std::runtime_error("listen socket failed."); throw std::runtime_error(strerror(errno));
cycle(); cycle();

View File

@ -0,0 +1,5 @@
//
// Created by 胡宇 on 2020/10/23.
//
#include "communicate/tcp_session.h"

View File

@ -12,11 +12,12 @@
using namespace Net; using namespace Net;
int main(int argc, char *argv[]){ int main(int argc, char *argv[]){
PrintTools::debugPrintSuccess("All Started.");
if(fork() == 0) { if(fork() == 0) {
PrintTools::debugPrintSuccess("Child Started."); PrintTools::debugPrintSuccess("Child Started.");
TCPClient client("127.0.0.1", 9048); TCPClient client("127.0.0.1", 9048);
for(int i = 0; i < 32; i++, usleep(1e4)) for(int i = 0; i < 32; i++, usleep(1e4))
client.sendData("Hello"); client.sendData("Hello\n");
PrintTools::debugPrintSuccess("Child Exited."); PrintTools::debugPrintSuccess("Child Exited.");
} }
else{ else{