can listen now
git-svn-id: file:///raid/svn-personal/tewi/trunk@8 8739d7e6-ffea-ec47-b151-bdff447c6205
This commit is contained in:
parent
6a90dfd259
commit
61c54add91
|
@ -4,5 +4,5 @@ CC = x86_64-w64-mingw32-gcc
|
||||||
AR = x86_64-w64-mingw32-ar
|
AR = x86_64-w64-mingw32-ar
|
||||||
CFLAGS = -g -std=c99 -DPREFIX=\"$(PREFIX)\" -I $(PWD)/Common -I $(PWD)/openssl/include
|
CFLAGS = -g -std=c99 -DPREFIX=\"$(PREFIX)\" -I $(PWD)/Common -I $(PWD)/openssl/include
|
||||||
LDFLAGS = -L $(PWD)/openssl/lib
|
LDFLAGS = -L $(PWD)/openssl/lib
|
||||||
LIBS =
|
LIBS = -lws2_32
|
||||||
EXEC = .exe
|
EXEC = .exe
|
||||||
|
|
|
@ -5,7 +5,7 @@ include $(PWD)/Platform/$(PLATFORM).mk
|
||||||
.PHONY: all clean
|
.PHONY: all clean
|
||||||
.SUFFIXES: .c .o
|
.SUFFIXES: .c .o
|
||||||
|
|
||||||
OBJS = version.o main.o config.o
|
OBJS = version.o main.o config.o server.o
|
||||||
|
|
||||||
all: tewi$(EXEC)
|
all: tewi$(EXEC)
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <cm_log.h>
|
#include <cm_log.h>
|
||||||
|
|
||||||
#include "tw_config.h"
|
#include "tw_config.h"
|
||||||
|
#include "tw_server.h"
|
||||||
#include "tw_version.h"
|
#include "tw_version.h"
|
||||||
|
|
||||||
extern bool cm_do_log;
|
extern bool cm_do_log;
|
||||||
|
@ -43,5 +44,9 @@ int main(int argc, char** argv) {
|
||||||
fprintf(stderr, "Could not read the config\n");
|
fprintf(stderr, "Could not read the config\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
if(tw_server_init() != 0) {
|
||||||
|
fprintf(stderr, "Could not initialize the server\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
cm_log("Daemon", "Ready");
|
cm_log("Daemon", "Ready");
|
||||||
}
|
}
|
||||||
|
|
110
Server/server.c
Normal file
110
Server/server.c
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
#include "tw_server.h"
|
||||||
|
|
||||||
|
#include "tw_config.h"
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <cm_log.h>
|
||||||
|
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
#include <winsock2.h>
|
||||||
|
#define NO_IPV6
|
||||||
|
#else
|
||||||
|
#include <sys/select.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <netinet/tcp.h>
|
||||||
|
#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;
|
||||||
|
}
|
8
Server/tw_server.h
Normal file
8
Server/tw_server.h
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
#ifndef __TW_SERVER_H__
|
||||||
|
#define __TW_SERVER_H__
|
||||||
|
|
||||||
|
int tw_server_init(void);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user