diff --git a/server/main.c b/server/main.c index 846bbf1..4fcf290 100644 --- a/server/main.c +++ b/server/main.c @@ -1,10 +1,8 @@ #include "server.h" int main(int argc, char *argv[]) { -// char quote[1024]; -// getRandomQuote(quote); -// printf("%s\n", quote); - tcpServer(); + // TODO: shell args + server(1, 1); return 0; } diff --git a/server/server.c b/server/server.c index b10377f..e715820 100644 --- a/server/server.c +++ b/server/server.c @@ -4,111 +4,52 @@ #include "server.h" -//TODO: refactor //TODO: object-like C extern int errno; -unsigned long addressLength = sizeof(struct sockaddr_in); -long recvLen; -int sock, serverSocket, clientSocket, socketType, socketProtocol; -struct sockaddr * srvAddr; -struct sockaddr_in serverAddress, clientAddress; -struct sockaddr_in serverAddress4, clientAddress4; -struct sockaddr_in6 serverAddress6, clientAddress6; -char quote[MESSAGE_STRING_LENGTH] = ""; -char clientMessage[MESSAGE_STRING_LENGTH] = ""; +_Noreturn void udpListen(int serverSocket, struct sockaddr * clientAddress, unsigned long addressLength) { + int recvLen; + char clientMessage[MESSAGE_STRING_LENGTH], quote[MESSAGE_STRING_LENGTH]; -void server(int tcp, int ipv6) { - // TODO: things common between tcp/udp here - // init sock info - memset(&serverAddress, 0, addressLength); - memset(&clientAddress, 0, addressLength); + for (;;) { + // receive data + recvLen = recvfrom(serverSocket, clientMessage, MESSAGE_STRING_LENGTH, 0, clientAddress, (socklen_t *) &addressLength); - if (ipv6) { - serverAddress6.sin6_family = AF_INET6; - serverAddress6.sin6_addr = in6addr_any; - serverAddress6.sin6_port = htons(17); - srvAddr = (struct sockaddr *) &serverAddress6; - } else { - serverAddress4.sin_family = AF_INET; - serverAddress4.sin_addr.s_addr = INADDR_ANY; - serverAddress4.sin_port = htons(17); - srvAddr = (struct sockaddr *) &serverAddress4; + perror("recvfrom"); + if (recvLen >= 0) { + printf("client says: %s\n", clientMessage); + + // send data + getRandomQuote(quote); + printf("responding: `%s`\n", quote); + sendto(serverSocket, quote, strlen(quote), 0, clientAddress, addressLength); + perror("sendto"); + } } - - // create sock - if (tcp) { - socketType = SOCK_STREAM; - socketProtocol = IPPROTO_TCP; - } else { - socketType = SOCK_DGRAM; - socketProtocol = IPPROTO_UDP; - } - - serverSocket = socket(srvAddr->sa_family, socketType, socketProtocol); - if (serverSocket == -1) { - puts("socket not created"); - exit(1); - } - puts("socket created"); - - // bind sock - if (bind(serverSocket, srvAddr, addressLength) < 0) { - puts("bind failed"); - exit(2); - } - - // TODO: udp/tcp - } -void tcpServer() { - /*initialize socket info*/ - memset(&serverAddress, 0, addressLength); - memset(&clientAddress, 0, addressLength); +void tcpListen(int serverSocket, struct sockaddr * clientAddress, unsigned long addressLength) { + int clientSocket; + char quote[MESSAGE_STRING_LENGTH] = "", clientMessage[MESSAGE_STRING_LENGTH] = ""; - serverAddress.sin_family = AF_INET; - serverAddress.sin_addr.s_addr = INADDR_ANY; - serverAddress.sin_port = htons(17); - - /*create socket*/ - serverSocket = socket(serverAddress.sin_family, SOCK_STREAM, IPPROTO_TCP); - if (serverSocket == -1) { - puts("socket not created"); - exit(1); - } - puts("socket created"); - - /*bind socket to address:port*/ - if (bind(serverSocket, (const struct sockaddr *) &serverAddress, addressLength) < 0) { - puts("bind failed"); - exit(2); - } - puts("address bound"); - - /*start listening*/ listen(serverSocket, 5); puts("server listening"); - /*accept connections*/ + // accept connections //TODO: t h r e a d s - while ((clientSocket = accept(serverSocket, (struct sockaddr *) &clientAddress, (socklen_t *) &addressLength)) >= + while ((clientSocket = accept(serverSocket, clientAddress, (socklen_t *) &addressLength)) >= 0) { puts("client connected"); - /*receive data*/ - while ((recvLen = recv(clientSocket, clientMessage, MESSAGE_STRING_LENGTH, 0))) { - if (recvLen < 0) { - puts("receive failed"); - } else { - printf("client says: %s\n", clientMessage); + // receive data + while (recv(clientSocket, clientMessage, MESSAGE_STRING_LENGTH, 0) >= 0) { + printf("client says: %s\n", clientMessage); - /*send data*/ - getRandomQuote(quote); - printf("responding: \"%s\"\n", quote); - send(clientSocket, quote, strlen(quote), 0); - } + // send data + getRandomQuote(quote); + printf("responding: \"%s\"\n", quote); + send(clientSocket, quote, strlen(quote), 0); } puts("client disconnected"); @@ -120,50 +61,61 @@ void tcpServer() { } } -_Noreturn void udpServer() { - /*initialize sock info*/ - memset(&serverAddress, 0, addressLength); - memset(&clientAddress, 0, addressLength); +void server(int tcp, int ipv6) { + int serverSocket, socketType, socketProtocol; + unsigned long serverAddressLength, clientAddressLength; + struct sockaddr *serverAddress, *clientAddress; + struct sockaddr_in serverAddress4, clientAddress4; + struct sockaddr_in6 serverAddress6, clientAddress6; - serverAddress.sin_family = AF_INET; - serverAddress.sin_addr.s_addr = INADDR_ANY; - serverAddress.sin_port = htons(17); + if (ipv6) { + serverAddress6.sin6_family = AF_INET6; + serverAddress6.sin6_addr = in6addr_any; + serverAddress6.sin6_port = htons(17); + serverAddress = (struct sockaddr *) &serverAddress6; + serverAddressLength = sizeof serverAddress6; - /*create sock*/ - sock = socket(serverAddress.sin_family, SOCK_DGRAM, IPPROTO_UDP); - if (sock == -1) { - puts("sock not created"); + clientAddress6.sin6_family = AF_INET6; + clientAddress = (struct sockaddr *) &clientAddress6; + clientAddressLength = sizeof clientAddress6; + } else { + serverAddress4.sin_family = AF_INET; + serverAddress4.sin_addr.s_addr = INADDR_ANY; + serverAddress4.sin_port = htons(17); + serverAddress = (struct sockaddr *) &serverAddress4; + serverAddressLength = sizeof serverAddress4; + + clientAddress4.sin_family = AF_INET; + clientAddress = (struct sockaddr *) &clientAddress4; + clientAddressLength = sizeof clientAddress4; + } + + if (tcp) { + socketType = SOCK_STREAM; + socketProtocol = IPPROTO_TCP; + } else { + socketType = SOCK_DGRAM; + socketProtocol = IPPROTO_UDP; + } + + // create sock + serverSocket = socket(serverAddress->sa_family, socketType, socketProtocol); + if (serverSocket == -1) { + puts("socket not created"); exit(1); } - puts("sock created"); + puts("socket created"); - /*bind sock to address:port*/ - if (bind(sock, (const struct sockaddr *) &serverAddress, addressLength) < 0) { + // bind sock + if (bind(serverSocket, serverAddress, serverAddressLength) < 0) { puts("bind failed"); exit(2); } - puts("address bound"); - //TODO: t h r e a d s ? - for (;;) { - /*receive data*/ - recvLen = recvfrom(sock, clientMessage, MESSAGE_STRING_LENGTH, 0, - (struct sockaddr *) &clientAddress, (socklen_t *) &addressLength); - - uint16_t port = ntohs(clientAddress.sin_port); - char *ipv4 = inet_ntoa(clientAddress.sin_addr); - - printf("recvLen = %ld from = %s:%d\nmsg = `%s`\n", recvLen, ipv4, port, clientMessage); - - perror("recvfrom"); - if (recvLen >= 0) { - printf("client says: %s\n", clientMessage); - - /*send data*/ - getRandomQuote(quote); - printf("responding: `%s`\n", quote); - sendto(sock, strcat(quote, "\n"), sizeof quote, 0, (struct sockaddr *) &clientAddress, addressLength); - perror("sendto"); - } + // TODO: threads to run both at the same time + if (tcp) { + tcpListen(serverSocket, clientAddress, clientAddressLength); + } else { + udpListen(serverSocket, clientAddress, clientAddressLength); } }