bool Server::init () { std::cout<<"Initializating Server"<<std::endl; #ifdef WIN32 m_version = MAKEWORD(2,0); m_error = WSAStartup(m_version, &m_wsaData); if(m_error != 0) return false; if(LOBYTE(m_wsaData.wVersion) != 2 || HIBYTE(m_wsaData.wVersion) != 0) { WSACleanup(); return false; } #endif int socketfd = CreateSocket(); if(socketfd == INVALID_SOCKET) { #ifdef WIN32 WSACleanup(); #endif return false; } m_server = socketfd; if (!bindServer() || !Listen()) { return false; } u_long iMode = 1; int iResult = ioctlsocket(m_server, FIONBIO, &iMode); if (iResult != NO_ERROR) { printf("ioctlsocket failed with error: %ld\n", iResult); return false; } return true; }
int createUDPServer(int port) { int server_udp; if (1 > port) { return -1; } server_udp = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); if (-1 == server_udp) { perror("socket:"); return -1; } /* server socket is nonblocking */ if (-1 == set_nonblock_fd(server_udp)) { perror("set_nonblock_fd:"); close(server_udp); return -1; } /* close server socket on exec so cgi's can't write to it */ if (-1 == fcntl(server_udp, F_SETFD, 1)) { perror("fcntl:"); close(server_udp); return -1; } /* internet family-specific code encapsulated in bindServer() */ if (-1 == bindServer(server_udp, NULL, port)) { perror("bind:"); close(server_udp); return -1; } return server_udp; }
/* * For Receive Clients Request */ int createTCPServer(int port) { int server_s; int sock_opt = 1; char localIP[IP_LENGTH] = {0}; server_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (-1 == server_s) { perror("socket:"); return -1; } /* server socket is nonblocking */ if (-1 == set_nonblock_fd(server_s)) { close(server_s); perror("set_nonblock_fd:"); return -1; } /* close server socket on exec so cgi's can't write to it */ if (-1 == fcntl(server_s, F_SETFD, 1)) { close(server_s); perror("fcntl:"); return -1; } /* reuse socket addr */ if (-1 == setsockopt(server_s, SOL_SOCKET, SO_REUSEADDR, (void *)&sock_opt, sizeof(sock_opt))) { close(server_s); perror("setsockopt:"); return -1; } /* internet family-specific code encapsulated in bind_server() */ if (-1 == getIP(ETH_NAME, localIP)) { close(server_s); printf("[%s][%d] ERROR: get IP addr. \n", __FILE__, __LINE__); return -1; } if (-1 == bindServer(server_s, NULL, port)) { close(server_s); perror("bind:"); return -1; } /* listen: large number just in case your kernel is nicely tweaked */ if (listen(server_s, ONVIF_TCP_MAXCONN) == -1) { close(server_s); perror("listen:"); return -1; } return server_s; }
void startServer(){ puts("Server Mode Starting..."); char* movieDir = getenv("NUTELLA"); if(!movieDir){ fprintf(stderr,"Error: NUTELLA variable not set, please set $NUTELLA to a movie directory.\n"); exit(1); } char hostname[1028]; hostname[1023] = '\0'; gethostname(hostname, 1023); strcat(hostname, ":7777"); int querySock = msockcreate(RECV, QUERYGROUP, QUERYPORT); int responseSock = msockcreate(SEND, RESPGROUP, RESPPORT); if(querySock == -1){ fprintf(stderr, "Error: Could not create query socket."); exit(-1); } if(responseSock == -1){ fprintf(stderr, "Error: Could not create response socket."); exit(-1); } char* query = calloc(256, sizeof(char)); int receivedLength; int port = 7777; DIR *dp; struct dirent *d; while(1) { puts("Now waiting for queries..."); receivedLength = mrecv(querySock, query, 256); printf("Received Query for: %s\n", query); dp = opendir(movieDir); if (dp == NULL) { fprintf(stderr, "ERROR: Couldn't open movie directory.\n"); exit(-1); } d = readdir(dp); while (d) { if(!strcmp(d->d_name, query)) break; d = readdir(dp); } closedir(dp); if(d) { msend(responseSock, hostname, strlen(hostname)); printf("Movie Found! Sending IP and port: %s\n", hostname); char* file = malloc(strlen(query) + strlen(movieDir) + 1); strcpy(file, movieDir); strcat(file, "/"); strcat(file, query); bindServer(file); }else{ puts("Movie not found."); } d =NULL; memset(query, 0, 256); } }