From 61c54add9149ec029241856a1408d01d5cc3ee71 Mon Sep 17 00:00:00 2001 From: Nishi Date: Fri, 13 Sep 2024 11:18:23 +0000 Subject: [PATCH] can listen now git-svn-id: file:///raid/svn-personal/tewi/trunk@8 8739d7e6-ffea-ec47-b151-bdff447c6205 --- Platform/win64.mk | 2 +- Server/Makefile | 2 +- Server/main.c | 5 +++ Server/server.c | 110 +++++++++++++++++++++++++++++++++++++++++++++ Server/tw_server.h | 8 ++++ 5 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 Server/server.c create mode 100644 Server/tw_server.h diff --git a/Platform/win64.mk b/Platform/win64.mk index 94763f9..a374bf7 100644 --- a/Platform/win64.mk +++ b/Platform/win64.mk @@ -4,5 +4,5 @@ CC = x86_64-w64-mingw32-gcc AR = x86_64-w64-mingw32-ar CFLAGS = -g -std=c99 -DPREFIX=\"$(PREFIX)\" -I $(PWD)/Common -I $(PWD)/openssl/include LDFLAGS = -L $(PWD)/openssl/lib -LIBS = +LIBS = -lws2_32 EXEC = .exe diff --git a/Server/Makefile b/Server/Makefile index 26a59e1..efaea2d 100644 --- a/Server/Makefile +++ b/Server/Makefile @@ -5,7 +5,7 @@ include $(PWD)/Platform/$(PLATFORM).mk .PHONY: all clean .SUFFIXES: .c .o -OBJS = version.o main.o config.o +OBJS = version.o main.o config.o server.o all: tewi$(EXEC) diff --git a/Server/main.c b/Server/main.c index 614f5e4..da854d7 100644 --- a/Server/main.c +++ b/Server/main.c @@ -9,6 +9,7 @@ #include #include "tw_config.h" +#include "tw_server.h" #include "tw_version.h" extern bool cm_do_log; @@ -43,5 +44,9 @@ int main(int argc, char** argv) { fprintf(stderr, "Could not read the config\n"); return 1; } + if(tw_server_init() != 0) { + fprintf(stderr, "Could not initialize the server\n"); + return 1; + } cm_log("Daemon", "Ready"); } diff --git a/Server/server.c b/Server/server.c new file mode 100644 index 0000000..af96368 --- /dev/null +++ b/Server/server.c @@ -0,0 +1,110 @@ +/* $Id$ */ + +#include "tw_server.h" + +#include "tw_config.h" + +#include +#include + +#include + +#ifdef __MINGW32__ +#include +#define NO_IPV6 +#else +#include +#include +#include +#include +#include +#endif + +extern struct tw_config config; + +fd_set fdset; +int sockcount = 0; +int sockets[MAX_PORTS]; + +#ifdef NO_IPV6 +struct sockaddr_in addresses[MAX_PORTS]; +#else +struct sockaddr_in6 addresses[MAX_PORTS]; +#endif + +void close_socket(int sock) { +#ifdef __MINGW32__ + closesocket(sock); +#else + close(sock); +#endif +} + +int tw_server_init(void) { + int i; +#ifdef __MINGW32__ + WSADATA wsa; + WSAStartup(MAKEWORD(2, 0), &wsa); +#endif + FD_ZERO(&fdset); + for(i = 0; config.ports[i] != -1; i++) + ; + sockcount = i; + for(i = 0; config.ports[i] != -1; i++) { +#ifdef NO_IPV6 + int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); +#else + int sock = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); +#endif +#ifdef __MINGW32__ + if(sock == INVALID_SOCKET) +#else + if(sock < 0) +#endif + { + cm_log("Server", "Socket creation failure"); + return 1; + } + int yes = 1; + if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*)&yes, sizeof(yes)) < 0) { + close_socket(sock); + cm_log("Server", "setsockopt failure (reuseaddr)"); + return 1; + } + if(setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void*)&yes, sizeof(yes)) < 0) { + close_socket(sock); + cm_log("Server", "setsockopt failure (nodelay)"); + return 1; + } +#ifndef NO_IPV6 + int no = 0; + if(setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&no, sizeof(no)) < 0) { + close_socket(sock); + cm_log("Server", "setsockopt failure (IPv6)"); + return 1; + } +#endif + memset(&addresses[i], 0, sizeof(addresses[i])); +#ifdef NO_IPV6 + addresses[i].sin_family = AF_INET; + addresses[i].sin_addr.s_addr = INADDR_ANY; + addresses[i].sin_port = htons(config.ports[i]); +#else + addresses[i].sin6_family = AF_INET6; + addresses[i].sin6_addr = in6addr_any; + addresses[i].sin6_port = htons(config.ports[i]); +#endif + if(bind(sock, (struct sockaddr*)&addresses[i], sizeof(addresses[i])) < 0) { + close_socket(sock); + cm_log("Server", "Bind failure"); + return 1; + } + if(listen(sock, 128) < 0) { + close_socket(sock); + cm_log("Server", "Listen failure"); + return 1; + } + sockets[i] = sock; + } + return 0; +} diff --git a/Server/tw_server.h b/Server/tw_server.h new file mode 100644 index 0000000..12bde4c --- /dev/null +++ b/Server/tw_server.h @@ -0,0 +1,8 @@ +/* $Id$ */ + +#ifndef __TW_SERVER_H__ +#define __TW_SERVER_H__ + +int tw_server_init(void); + +#endif