Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netdb.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #include <string.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <limits.h>
- #include <signal.h>
- #include <sys/wait.h>
- int counter = 1;
- volatile int flag = 0;
- int arr[1000000];
- int arrsize = 0;
- // должен закрывать все открытые дескрипторы
- void handler(int s) {
- for (int i = 0; i < arrsize; ++i) {
- kill(arr[i], SIGTERM);
- }
- while (wait(NULL) > 0);
- exit(0);
- }
- int main(int argc, char *argv[]) {
- struct sigaction sa = {};
- sa.sa_flags = SA_RESTART;
- sa.sa_handler = handler;
- sigaction(SIGTERM, &sa, NULL);
- int fd = socket(PF_INET, SOCK_STREAM, 0);
- if (fd < 0) {
- perror("socket");
- return 1;
- }
- int val = 1;
- setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
- setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
- struct sockaddr_in s1;
- s1.sin_family = AF_INET;
- s1.sin_port = htons(strtol(argv[1], NULL, 10));
- s1.sin_addr.s_addr = INADDR_ANY;
- int r = bind(fd, (struct sockaddr*) &s1, sizeof(struct sockaddr_in));
- if (r < 0) {
- perror("bind");
- return 1;
- }
- listen(fd, 5);
- ssize_t res;
- char buf[1024];
- while (1) {
- while (waitpid(-1, NULL, WNOHANG) > 0);
- struct sockaddr_in s2;
- socklen_t slen = sizeof(s2);
- int fd2 = accept(fd, (struct sockaddr*) &s2, &slen);
- // для каждого клиента создаем отдельный процесс
- if (!fork()) {
- arr[arrsize] = getpid();
- arrsize++;
- close(fd);
- int myNum = counter++;
- sprintf(buf, "%s\r\n", argv[2]);
- res = write(fd2, buf, strlen(buf));
- if (res <= 0) {
- exit(0);
- }
- sprintf(buf, "%d\r\n", myNum);
- res = write(fd2, buf, strlen(buf));
- if (res <= 0) {
- exit(0);
- }
- int maxNum;
- res = read(fd2, buf, sizeof(buf));
- if (res <= 0) {
- exit(0);
- }
- buf[res] = '\0';
- maxNum = strtol(buf, NULL, 10);
- while (1) {
- res = read(fd2, buf, sizeof(buf));
- if (res <= 0) {
- exit(0);
- }
- buf[res] = '\0';
- int num = strtol(buf, NULL, 10);
- if (num > maxNum || num > INT_MAX - myNum) {
- strcpy(buf, "-1\r\n");
- res = write(fd2, buf, 4);
- if (res <= 0) {
- exit(0);
- }
- close(fd2);
- return 0;
- } else {
- sprintf(buf, "%d\r\n", num + myNum);
- res = write(fd2, buf, strlen(buf));
- if (res <= 0) {
- exit(0);
- }
- }
- }
- }
- close(fd2);
- }
- exit(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement