int build_socket(char *http_port, char *dns_port, int *hd, int *dd){ if((*hd = passivesock(http_port, IPPROTO_TCP, 10)) < 0){ csprintf("Fail to socket for httpd port: %s.\n", http_port); return -1; } if((*dd = passivesock(dns_port, IPPROTO_UDP, 10)) < 0){ csprintf("Fail to socket for DNS port: %s.\n", dns_port); return -1; } return 0; }
/*------------------------------------------------------------------------ * passiveUDP - create a passive socket for use in a UDP server *------------------------------------------------------------------------ */ SOCKET passiveUDP(const char *service) { /* * Arguments: * service - service associated with the desired port */ return passivesock(service, "udp", 0); }
SOCKET passiveTCP(const char *service, int qlen) { /* * Arguments: * service - service associated with the desired port * qlen - maximum server request queue length */ return passivesock(service, "tcp", qlen); }
/*--------------------------------------------------------------------------- * Процедура passiveTCP - создает пассивный сокет для использования * в сервере TCP *--------------------------------------------------------------------------- */ int passiveTCP(const char *service, int qlen) /* * Параметры: * service - служба, связанная с требуемым портом * qlen - максимальная длина очереди запросов сервера */ { return passivesock(service, "tcp", qlen); }
/*------------------------------------------------------------------------ * main - Concurrent TCP server for ECHO service *------------------------------------------------------------------------ */ int main(int argc, char *argv[]) { char *portnum = "5004"; /* Standard server port number */ struct sockaddr_in fsin; /* the from address of a client */ int msock; /* master server socket */ fd_set rfds; /* read file descriptor set */ fd_set afds; /* active file descriptor set */ unsigned int alen; /* from-address length */ int fd, nfds; switch (argc) { case 1: break; case 2: portnum = argv[1]; break; default: errexit("usage: %s [port]\n",argv[0]); } msock = passivesock(portnum, QLEN); nfds = getdtablesize(); FD_ZERO(&afds); FD_SET(msock, &afds); while (1) { memcpy(&rfds, &afds, sizeof(rfds)); if (select(nfds, &rfds, (fd_set *)0, (fd_set *)0, (struct timeval *)0) < 0) errexit("select: %s\n", strerror(errno)); if (FD_ISSET(msock, &rfds)) { int ssock; alen = sizeof(fsin); ssock = accept(msock, (struct sockaddr *)&fsin, &alen); if (ssock < 0) errexit("accept: %s\n", strerror(errno)); FD_SET(ssock, &afds); } for (fd=0; fd<nfds; ++fd) if (fd != msock && FD_ISSET(fd, &rfds)) if (echo(fd) == 0) { (void) close(fd); FD_CLR(fd, &afds); } } }
int main(int argc, const char * argv[]) { // handling zombie processes signal(SIGCHLD, handleSIGCHLD); srand(time(0)); init_client_list(); init_global_pipe_list(); init_message_boxes(); struct sockaddr_in my_addr; struct sockaddr_in client_addr; int port = 2000 + rand() % 100; printf("Port : %d\n", port); char port_str[5]; sprintf(port_str, "%d", port); int sc_fd = passivesock(port_str, "tcp", 5); printf("accepting.....\n"); int addrlen = sizeof(client_addr); while(1) { int new_client_sock = accept(sc_fd, (struct sockaddr *)&client_addr, (socklen_t*)&addrlen); int pid = fork(); if(pid == 0) { // child client_node_t* client = create_client_node(new_client_sock, "CGILAB"/*inet_ntoa(client_addr.sin_addr)*/, 511/*ntohs(client_addr.sin_port)*/); close(sc_fd); if(insert_to_client_list(client) != -1) { serve(client); close(new_client_sock); return 0; } } else { close(new_client_sock); } } return 0; }
int main(int argc, char *argv[]) { struct sockaddr_in6 fsin, clientadr; /* the from address of a client */ int cliadrlen = sizeof(cliadrlen); memset(&fsin, 0, sizeof(fsin)); char str[INET6_ADDRSTRLEN]; bzero((char *) &fsin, sizeof(fsin)); int msock, ssock; /* master & slave sockets */ socklen_t alen = sizeof(fsin); /* from-address length */ msock = passivesock(QLEN); while (1) { ssock = accept(msock, (struct sockaddr *)&fsin, &alen); getpeername(ssock, (struct sockaddr *)&clientadr, &cliadrlen); if(inet_ntop(AF_INET6, &clientadr.sin6_addr, str, sizeof(str))) { printf("Client address is %s\n", str); printf("Client port is: %d\n", ntohs(clientadr.sin6_port)); } if (ssock < 0) errexit("accept failed: %s\n", strerror(errno)); (void) TCPdaytimed(ssock); (void) close(ssock); } }
// Main function int main(int argc,char* argv[]) { // Main socket and servant socket int listenfd, connectfd; pthread_t thread; ARG *arg; // Service-end socket addr struct sockaddr_in server; // Client-end socket addr struct sockaddr_in client; socklen_t ssize = sizeof(struct sockaddr_in); echo("[SERVICE] creating passive socket..\n"); listenfd = passivesock(&server); echo("[SERVICE] passive socket %d created.\n", listenfd); while(1) { // connect to first client, create temporary socket echo("[SERVICE] waiting for client..\n"); if ((connectfd = accept(listenfd, (struct sockaddr*)&client, &ssize)) < 0) errexit("accept failed: %s\n", strerror(errno)); echo("[SERVICE] servant socket %d created.\n", connectfd); // Initial client information struct arg = malloc(sizeof(ARG)); arg->connectfd = connectfd; //NOTE: threads sharing the memory, client variable cannot reuse // deep copy memcpy(&arg->client, &client, sizeof(client)); if (pthread_create(&thread, NULL, startRoutine, (void*)arg)) errexit("create thread failed: %s\n", strerror(errno)); } close(listenfd); return 0; }
int passiveUDP(const char *service) { return passivesock(service, "udp", 0); }
int passiveTCP(const char *service, int qlen) { return passivesock(service, "tcp", qlen); }
int passiveTCP(int port, int qlen) { return passivesock(port, "tcp", qlen); }