Skip to content

Commit

Permalink
Merge pull request #18 from Webserve4242/17-implement-socket
Browse files Browse the repository at this point in the history
implement) socket
  • Loading branch information
molhot authored Sep 5, 2023
2 parents a2df522 + abf7002 commit 44289ab
Show file tree
Hide file tree
Showing 15 changed files with 780 additions and 25 deletions.
42 changes: 42 additions & 0 deletions .github/workflows/gtest.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: UNIT_TEST
on: [push]
jobs:
Linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- name: build
run: |
cmake -S . -B build
cmake --build build
- name: run all tests on Linux
run: ./build/unit_test

- uses: sarisia/actions-status-discord@v1
if: always()
with:
title: "UNIT_TEST_ON_LINUX"
webhook: ${{ secrets.DISCORD_WEBHOOK }}
status: ${{ job.status }}

macOS:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3

- name: build
run: |
cmake -S . -B build
cmake --build build
- name: run all tests on macOS
run: ./build/unit_test

- uses: sarisia/actions-status-discord@v1
if: always()
with:
title: "UNIT_TEST_ON_MACOS"
webhook: ${{ secrets.DISCORD_WEBHOOK }}
status: ${{ job.status }}
2 changes: 1 addition & 1 deletion .github/workflows/unit_test.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: UNIT_TEST
name: UNIT_TEST_SH
on: [push]
jobs:
run-unit-test:
Expand Down
6 changes: 4 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@
!config

!srcs
!srcs/**
!srcs/Socket
!www
!includes
!test
!playground

!*.cpp
!*.hpp
Expand All @@ -22,8 +23,9 @@
!Makefile
!CPPLINT.cfg
!webserv.drawio
!CMakeLists.txt

.idea
.vscode
.DS_Store
CMakeLists.txt
CMakeCache.txt
58 changes: 58 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
cmake_minimum_required(VERSION 3.23)
project(webserv)

set(CMAKE_CXX_STANDARD 98)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "-std=c++98 -Wall -Wextra -Werror -pedantic")

# google test ------------------------------------------------------------------
include(FetchContent)
include(GoogleTest)

FetchContent_Declare(
googletest
DOWNLOAD_EXTRACT_TIMESTAMP true
URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
enable_testing()


# when you .cpp or .hpp is added, add the following
# include, webserv srcs, unit_test_srcs
# includes ---------------------------------------------------------------------
include_directories(
includes
srcs/Socket
)

# webserv_srcs -----------------------------------------------------------------
set(webserv_srcs
srcs/get_valid_config_file_path.cpp
srcs/Socket/Socket.cpp
)

add_executable(webserv
srcs/main.cpp
${webserv_srcs}
)

# unit_test_srcs ---------------------------------------------------------------
set (unit_test_srcs
test/unit_test/is_valid_file_path/test_get_valid_config_file_path.cpp
test/unit_test/TestSocket.cpp
)

add_executable(unit_test
${webserv_srcs}
${unit_test_srcs}
)

# test -------------------------------------------------------------------------
target_link_libraries(
unit_test
GTest::gtest_main
)

gtest_discover_tests(unit_test)
25 changes: 18 additions & 7 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ SRCS_DIR = srcs
SRCS = main.cpp \
get_valid_config_file_path.cpp

#socket
SOCKET_DIR = Socket
SRCS += $(SOCKET_DIR)/Socket.cpp


# OBJS -------------------------------------------------------------------------
OBJS_DIR = objs
Expand All @@ -22,21 +26,20 @@ DEPS = $(OBJS:%.o=%.d)


# INCLUDES ---------------------------------------------------------------------
INCLUDES_DIR = includes srcs/includes
INCLUDES_DIR = includes \
$(SRCS_DIR)/$(SOCKET_DIR)
INCLUDES = $(addprefix -I, $(INCLUDES_DIR))


# RULES ------------------------------------------------------------------------
.PHONY : all
all : $(OBJS_DIR) $(NAME)
all : $(NAME)

$(NAME) : $(OBJS)
$(CXX) $(CXXFLAGS) -o $@ $^

$(OBJS_DIR) :
@mkdir -p $@

$(OBJS_DIR)/%.o : $(SRCS_DIR)/%.cpp
@mkdir -p $$(dirname $@)
$(CXX) $(CXXFLAGS) $(INCLUDES) -c -o $@ $<

.PHONY : clean
Expand All @@ -54,9 +57,17 @@ re : fclean all
lint :
cpplint --recursive srcs

#.PHONY : unit
#unit :
# ./test/unit_test/run_unit_test.sh

.PHONY : unit
unit :
./test/unit_test/run_unit_test.sh

#rm -rf build
cmake -S . -B build
cmake --build build
#./build/unit_test 2>/dev/null
./build/unit_test
#cd build && ctest

-include $(DEPS)
9 changes: 6 additions & 3 deletions includes/webserv.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

# define EXECUTABLE_FILE_ONLY_ARGC 1
#include <string>

# define CONFIG_FILE_GIVEN_ARGC 2
# define CONFIG_FILE_INDEX 1

Expand All @@ -10,10 +11,12 @@
# define PATH_DELIM '/'
# define EXTENSION_DELIM '.'

# define STAT_ERROR (-1)
# define STAT_ERROR (-1)
# define ERROR (-1)
# define OK 0

# define INVALID_ARGUMENT_ERROR_MSG "[Error] invalid argument"
# define INVALID_PATH_ERROR_MSG "[Error] invalid file path"

std::string get_valid_config_file_path(int argc, char **argv);
std::string get_valid_config_file_path(const char *path);
bool is_valid_config_file_path(const char *path); // todo: static
5 changes: 5 additions & 0 deletions playground/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
*

!.gitignore
!*.cpp
!*.hpp
69 changes: 69 additions & 0 deletions playground/playground_socket.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#include <fcntl.h>
#include <netdb.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
#include <cerrno>
#include <cstring>
#include <string>
#include <iostream>

int test_socket(const char *server_ip, const char *server_port) {
int errcode;
int socket_fd;
int ai_family, ai_socktype, ai_protocol;
struct addrinfo *addr_info;
struct addrinfo hints = {};
// const char *server_ip = "127.0.0.1";
// const char *server_port = "65536";

printf("ip:%s, port:%s\n", server_ip, server_port);

hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AF_UNSPEC; // allows IPv4 and IPv6
hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST | AI_NUMERICSERV; // socket, IP, PORT
hints.ai_protocol = IPPROTO_TCP;

errcode = getaddrinfo(server_ip, server_port, &hints, &addr_info);
if (errcode != 0) {
std::cerr << "[Error] getaddrinfo:" << gai_strerror(errcode) << std::endl;
return 1;
}
// std::cout << "errcode:" << errcode << ", " <<

ai_family = addr_info->ai_family;
ai_socktype = addr_info->ai_socktype;
ai_protocol = addr_info->ai_protocol;
errno = 0;
std::cout << "socket" << std::endl;
socket_fd = socket(ai_family, ai_socktype, ai_protocol);
if (socket_fd == -1) {
std::cerr << "[Error] socket:" << strerror(errno) << std::endl;
return 1;
}

std::cout << "bind" << std::endl;
errno = 0;
if (bind(socket_fd, addr_info->ai_addr, addr_info->ai_addrlen) == -1) {
std::cerr << "[Error] bind:" << strerror(errno) << std::endl;
return 1;
}

std::cout << "listen" << std::endl;
if (listen(socket_fd, SOMAXCONN) == -1) {
std::cerr << "[Error] listen:" << strerror(errno) << std::endl;
return 1;
}

std::cout << "OK" << std::endl;
return 0;
}

// port 0, 0はエラーにならない
int main() {
int ret1 = test_socket("255.255.255.254", "8080");
int ret2 = test_socket("255.255.255.254", "8080");

std::cout << "ret1:" << ret1 << std::endl;
std::cout << "ret2:" << ret2 << std::endl;
}
Loading

0 comments on commit 44289ab

Please sign in to comment.