int main(int argc, char** argv) { WSADATA data; int result = WSAStartup(MAKEWORD(2, 2), &data); if (result != 0) { fprintf(stderr, "Error in WSAStartup\n"); return EXIT_FAILURE; } SOCKET listensocket = socket(AF_INET,SOCK_STREAM, 0); if (listensocket == INVALID_SOCKET) { fprintf(stderr, "Create socket failed: %ld\n", WSAGetLastError()); WSACleanup(); return EXIT_FAILURE; } struct sockaddr_in local; local.sin_family = AF_INET; local.sin_addr.s_addr = INADDR_ANY; local.sin_port = htons(PORT); result = bind(listensocket, (struct sockaddr*)&local, sizeof(local)); if (result == SOCKET_ERROR) { fprintf(stderr, "Bind failed: %ld\n", WSAGetLastError()); WSACleanup(); return EXIT_FAILURE; } result = listen(listensocket, 1); if (result == SOCKET_ERROR) { fprintf(stderr, "Listen failed: %ld\n", WSAGetLastError()); return EXIT_FAILURE; } printf("Server started at localhost:%d...\n", PORT); while (!terminate) { struct sockaddr_in remote; int sockaddr_len = sizeof(remote); SOCKET clientsocket = accept(listensocket, (struct sockaddr*)&remote, &sockaddr_len); if (clientsocket == INVALID_SOCKET) { fprintf(stderr, "Accept failed: %d\n", WSAGetLastError()); return EXIT_FAILURE; } printf("Connected %s:%d\n", inet_ntoa(remote.sin_addr), ntohs(remote.sin_port)); client_worker(clientsocket); printf("Disconnected\n"); } closesocket(listensocket); WSACleanup(); return (EXIT_SUCCESS); }
int main(int argc, char** argv) { int result; int on; struct sockaddr_in local; int listensocket = socket(AF_INET, SOCK_STREAM, 0); on = 1; setsockopt(listensocket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); if (listensocket < 0) { fprintf(stderr, "Create socket failed.\n"); return -1; } local.sin_family = AF_INET; local.sin_addr.s_addr = INADDR_ANY; local.sin_port = htons(BW_PORT); result = bind(listensocket, (struct sockaddr*)&local, sizeof(local)); if (result < 0) { fprintf(stderr, "Bind failed.\n"); return -1; } result = listen(listensocket, 1); if (result < 0) { fprintf(stderr, "Listen failed.\n"); return -1; } while(1) { struct sockaddr_in remote; unsigned int sockaddr_len = sizeof(remote); int clientsocket = accept(listensocket, (struct sockaddr*)&remote, &sockaddr_len); if (clientsocket < 0) { fprintf(stderr, "Accept failed.\n"); return -1; } client_worker(clientsocket); close(clientsocket); } close(listensocket); return 0; }
int main(int argc, char** argv) { int sockfd, new_fd; // listen on sock_fd, new connection on new_fd struct addrinfo hints, *servinfo, *p; struct sockaddr_storage their_addr; // connector's address information socklen_t sin_size; struct sigaction sa; int yes=1; char s[INET6_ADDRSTRLEN]; int rv; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; // use my IP if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); return EXIT_FAILURE; } // loop through all the results and bind to the first we can for(p = servinfo; p != NULL; p = p->ai_next) { if ((sockfd = socket(p->ai_family, p->ai_socktype,p->ai_protocol)) <0){ perror("server: socket"); continue; } if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,sizeof(int)) <0){ perror("setsockopt"); return EXIT_FAILURE; } if (bind(sockfd, p->ai_addr, p->ai_addrlen) <0){ close(sockfd); perror("server: bind"); continue; } break; } if (p == NULL) { fprintf(stderr, "server: failed to bind\n"); return EXIT_FAILURE; } freeaddrinfo(servinfo); // all done with this structure if (listen(sockfd, BACKLOG) <0) { perror("listen"); return EXIT_FAILURE; } sa.sa_handler = sigchld_handler; // reap all dead processes sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; if (sigaction(SIGCHLD, &sa, NULL) <0) { perror("sigaction"); return EXIT_FAILURE; } printf("server: waiting for connections at port %s...\n", PORT); while(1) { // main accept() loop sin_size = sizeof their_addr; new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size); if (new_fd < 0) { perror("accept"); continue; } inet_ntop(their_addr.ss_family, get_in_addr((struct sockaddr *)&their_addr), s, sizeof s); printf("server: got connection from %s\n", s); if (!fork()) { // this is the child process close(sockfd); // child doesn't need the listener client_worker(new_fd); close(new_fd); return 0; } close(new_fd); // parent doesn't need this } return (EXIT_SUCCESS); }