LINUX.ORG.RU

8
Всего сообщений: 153

Сокеты. Определить адрес IP сервера при подключении клиента.

Суть : Есть программа-сервер слушающие по TCP/IP все интерфейсы(их достаточно много, в том числе несколько интерфейсов от провайдеров.
Задача : отследить на сервере на какой адрес (IP) сервера подключается клиент.

server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);

Вопрос : Как можно (желательно кроссплатформенно, но не критично, достаточно linux) определить на какой именно IP сервера пришел подключающийся клиент.
В «accept» есть информация похоже только о клиенте.

P.S. Альтернативный вариант логгирования через iptables, пока не интересует, надо средствами самого программы1-сервера.

 

Atlant ()

Про преобразования сокетов

Копаюсь в ядре Linux и частенько натыкаюсь, например, на такое:

struct inet_connection_sock *icsk = build_icsk(test);
KUNIT_ASSERT_EQ(test, 0,
                       mptcp_token_new_connect((struct sock *)icsk));

Вопрос: как работает вот это выражение:

(struct sock *)

Это, я так понимаю, преобразование из одной структуры в другую? Но как это происходит? Где посмотреть?

 , ,

czan ()

Как правильно юзать LuaSocket под оффтопиком?

Смеркалось.

Написал я как-то программку, хорошую, годную, естественно, под линукс. Написал на Си, для окнорисования использовал gtk и чуть-чуть немножечко Lua для всякого скриптования. Написал и пользуюсь и люди пользуются и вообще все замечательно.

Теперь (начинает играть тревожная музыка) о проблеме: некоторые несознательные граждане пользуются виндой и им нужна эта моя программка на винду: казалось бы, все кроссплатформенное, бери, компиляй под винду и раздавай кактусоедам. И я, собственно, так и сделал: построил билд-машинку, поднял на ней MXE (на редкость ловкая штука), немножечко переколдовал мейкфайл и все замечательно работало до тех пор пока я не подключил в свою lua-логику ейную библиотеку про сокеты.

Оказалось, что виндоус-версия ничего ни про какие луа сокеты не знает (сам луа у меня статически вкомпилен в бинарик основной программы), ну, думаю, не беда: нагуглил скомпиленный уже dll с этими сокетами, сунул в папку с программой – невразумительно ругается (%1 не является приложением вин32), ладно, думаю, я не тупее всех, склонил к себе исходники этих луа-сокетов, изородовал тамошний мейкфайл – стало оно мне dll-ку собирать вместе с проектом, но она (длл-ка) тоже не подхватывается, пишет «не найдена указанная процедура» – сижу, наслаждаюсь информативностью виндовых сообщений об ошибках…

Теперь вопросы:

  1. Как это вообще побеждать?

  2. Как это делается правильно?

  3. Как это можно победить наименьшей кровью? (ну, например, заставлять кактусоедов сначала что-то там себе устанавливать на винду, а потом уже пущать мою прогу)

Линукс тут при том, что программа разрабатывается под линукс, а виндоверсия – приятный бонус в данном случае.

Спасибо!

 , , ,

pihter ()

Узнать побольше данных про открытые приложением сокеты

Привет!

Есть невероятно криво написанное серверное приложение (гремучая смесь Scala и Java, JVM, в общем, приправленное кучей библиотек).

Есть там какая-то утечка. Открываются какие-то сокеты, и потом не закрываются. Когда они заканчиваются, оно предсказуемо падает с too many open files.

Это мало кого смущает в этом бессмысленном беспощадном мире облачных вычислений. Сервер просто заменяется каким-то демоном после того как перестаёт отвечать на запросы и всё. И работает дальше. До следующего падения.

Но мне не даёт покоя, хочу разобраться, что же там внутри такое происходит. Где именно ошибка, драйвер ли это базы данных, или какой-то HTTP-клиент, или HTTP-сервер. Для своего саморазвития хочу больше разобраться.

Команда lsof -p pid выдаёт невероятное число строчек с «Can’t identify protocol».

java    (pid) (пользователь) *000u  sock                0,8       0t0 (номер) can't identify protocol

Если точнее, то

lsof -p pid | grep -c  "can't identify protocol"

Выдаёт огромное число, более 65000.

Что дальше тут можно раскопать? Как определить всё-таки протокол? Если это TCP, то можно ли как-то, например, узнать, удалённый IP-адрес и порт, к которому эта программа подключается, если это клиентский сокет? Или это может быть и серверный?

 , , ,

BattleCoder ()

TCP bind определенный интерфейс

Доброй ночи!

На сервере есть несколько сетевых интерфейсов, и только первый из них является шлюзом по умолчанию.

Если я создаю сокет и делаю ему bind с IP адресом определенного интерфейса - могу слушать на нем и UDP пакет ответа уходит именно с указанного интерфейса. Как задумано.

Кроме того, я хочу чтобы один php скрипт осуществлял подключения также с выбранного интерфейса, не являющегося шлюзом по умолчанию.

Для этого вызываю stream_context_create() со значением socket-bindto равным ‘1.2.3.4:0’ (тут адрес выбранного интерфейса) и далее file_get_contents(), но получаю ошибку таймаута на любом интерфейсе кроме первого. Очевидно какие-то проблемы с маршрутизацией SYN / ACK пакетов. Дампы не писал.

После

iptables -t nat -A POSTROUTING -j MASQUERADE`

у меня тот же код подключается нормально, но на запрашиваемом узле отображается IP адрес шлюза по умолчанию.

Как решить эту проблему чтобы и TCP и UDP шло с выбранного интерфейса, не являющегося шлюзом по умолчанию?

Как альтернативу, дайте пожалуйста команды для iptables которые будут маршрутизировать весь трафик на определенный IP адрес через выбранный интерфейс.

 , , ,

Dima_228 ()

Аналог winapi-шной getaddrinfoex в Linux

Здравствуйте,

Подскажите пожалуйста, есть ли в Linux’e аналог винапишной функции getaddrinfoex, которая в свою очередь является рамширением стандартной функции getaddrinfo из сокетов для запроса соответсвия URL адресса —> ip адрессу в асинхронном режиме, а не в блокирующем, как getaddrinfo ?

 , ,

Optimus1 ()

Почему копия /usr/bin/ping пингует не смотря ни на что?

Всем привет. Такой странный вопрос возник

Дистрибутив Manjaro. Копирую /usr/bin/ping в домашнюю директорию. В результате чего локальный пинг получает привелегии обычного юзера. Запускаю ./ping 8.8.8.8 - пингует. Переименовываю файл, запускаю ./shming 8.8.8.8 - рабтает!

А ведь вроде не должно? Локальный юзер по идее не может создавать RAW сокеты. Почему тогда пингует?

 , ,

kijllfatncdaplp ()

Куда лучше класть socket-файлы и pid-файлы?

Существует приложение, которое работает через supervisord от пользователя www-data.

Где лучше располагать socket-файлы? Нужно, чтобы в этой директории не root-пользователь мог создавать socket-файлы в момент запуска приложения. И чтобы директория очищалась после ребута (потому что если сервер перезагрузится аварийно, приложение не сможет запуститься само, оно будет говорить о том, что socket-файл уже существует).

/tmp/ не подходит, так как оно самоощищается в Ubuntu через N дней. Менять это поведение не хочется, так как там реально хранится мусор, который надо подчищать. /var/run не подходит, так как там только root может создавать файлы и каталоги.

/var/tmp – не уверен, что хорошая идея.

Интересует на Ubuntu 20.04 и Centos 7\8.

Перейти на запуск приложения через systemd не предлагать.

 ,

iljuase ()

Вопрос по сокет ответу

Есть 2 функции, 1 в бесконечном цикле проверяет ответ сокета, вторую можно вызвать когда угодно и она так же возвращает ответ сокета, собственно вопрос возникает логичный, если 1 функция постоянно проверяет начиние нужного ответа, то при выполнении 2й ответа никакого не будет, 1я его уже словила.
Ведь даже есть сделать проверку if self.socket.recv() == 'I' это уже будет считаться за получение ответа.

 , ,

noname_user ()

Отсылает ли recv что-либо серверу после загрузки указанной части?

Есть серверы icann.org, там не поддерживается частичная загрузка «range: bytes=». Можно и с помощью recv пропустить часть загрузки не тратя на это трафик? Отсылает ли что-либо recv после загрузки части потока? Скажем у меня recv(1024).

 

steemandlinux ()

Tor socket activation

ДВС.

Поддерживает ли Tor запуск через механизм systemd socket activation?

Upd. Похоже что нет

 , ,

tt47 ()

C socket fdopen вечный/долгий fgets при запросе с chrome android

Столкнулся со странным (непонятным) поведением fgets при чтении данных с сокета посредством fdopen. При запросе с десктопной версии браузера всё хорошо, но когда запрос идет с мобильного браузера chrome, то fgets виснет.

С чем это связано? fgets не находит символа новой строки/EOF? Так fgets все равно должен завершиться при достижении предела num.

char *fgets(char *str, int num, FILE *stream);

Тогда, получается, сам мобильный chrome шлет непрерывные данные в каком-то запросе? Я правильно понимаю (баг chrome? почему fgets при достижении предела num не завершился?)? Или в чем причина?

Да, при использовании read такое поведение не замечено.

ssize_t read(int fd, void *buf, size_t count);

Минималку из своего pet-проекта делать не стал, вот отсюда (https://ycpcs.github.io/cs365-spring2017/lectures/lecture15.html) тупо (для теста, вдруг я где накосячил) взял пример - то же самое поведение.

// This is like server.c, but uses fdopen to allow communication
// via stdio functions rather than Unix system calls

#include <unistd.h>
#include <stdio.h> // for perror()
#include <stdlib.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <fcntl.h>

#include <netinet/in.h> // for struct sockaddr_in
#include <arpa/inet.h> // for inet_pton

#include <string.h>

#define PORT 40002
#define BUFSIZE 2000

int main(void)
{
	int server_sock_fd;
	int rc;
	char buf[BUFSIZE];
	int done = 0;

	server_sock_fd = socket(PF_INET, SOCK_STREAM, 0);
	if (server_sock_fd < 0) {
		perror("Couldn't create socket");
		exit(1);
	}

	struct sockaddr_in server_addr;
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(PORT);
	inet_pton(AF_INET, "0.0.0.0", &server_addr.sin_addr);

	rc = bind(
		server_sock_fd,
		(struct sockaddr *) &server_addr,
		sizeof(server_addr));
	if (rc < 0) {
		perror("Couldn't bind server socket");
		exit(1);
	}

	rc = listen(server_sock_fd, 5);
	if (rc < 0) {
		perror("Couldn't listen on server socket");
		exit(1);
	}

	while (!done) {
		int client_socket_fd;
		struct sockaddr_in client_addr;
		socklen_t client_addr_size = sizeof(client_addr);

		client_socket_fd = accept(
			server_sock_fd,
			(struct sockaddr*) &client_addr,
			&client_addr_size);
		if (client_socket_fd < 0) {
			perror("Couldn't accept connection");
			exit(1);
		}

		// Wrap the socket file descriptor using a FILE*,
		// for reading only.
		FILE *client_socket_fh = fdopen(client_socket_fd, "r");

		printf("before fgets\n");

		// Read one line from the client
		fgets(buf, BUFSIZE, client_socket_fh);

		printf("after fgets\n");

		// Close the client socket
		fclose(client_socket_fh);

		// Write the received message to stdout
		printf("%s", buf);

                // Отсутствовало в примере, добавил
                close(client_socket_fd);

		if (strcmp(buf, "quit\r\n") == 0) {
			done = 1;
		}
	}

	close(server_sock_fd);

	return 0;
}

Т.е. c десктопного chrome вывод в консоль: before fgets after fgets

C мобильного под android: before fgets <висим до закрытия вкладки/браузера> after fgets

 , , ,

Stack77 ()

ограничить время работы сокета

Имеется сокет под управлением библиотеки SSL

#include <sys/socket>
#include <openssl/ssl.h>
...
sock = sockect(AF_INET, SOCK_STREAM, 0);
...
SSL_library_init();
...
SSL_set_fd(sockSsl, sock);

Как ограничить время работы функций установки соединения, чтения и записи N секундами?

int N = 45;
// что-то, может setsockopt()
...
connect(s, ...);// если за N сек. не соединился, то вернул 0 или что-то отрицательное
...
int l = SSL_read(ssl, buf, len);// если за N сек. не прочитал, то вернул 0 или что-то отрицательное
...
int l = SSL_write(ssl, buf, len)// // если за N сек. не записал, то вернул 0 или что-то отрицательное

P.S. пробовал установить время в setsockopt() - не работает (

 ,

smartscientist ()

В чем ошибка чтения?

Пытаюсь переслать команду на сервер, пишет ошибка чтения - нет ошибки? Сервер:

//g++  7.4.0

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <unistd.h>
void error(const char* msg)
{
    perror(msg);
    std::cin.ignore();
    exit(1);
}
int main()
{
        int sockfd, newsockfd;
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd < 0)
            error("ERROR opening socket");
        struct sockaddr_in serv_addr,cli_addr;
        bzero((char*)&serv_addr, sizeof(serv_addr));
        bzero((char*)&cli_addr, sizeof(cli_addr));
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = INADDR_ANY;
        int port = 30000;
        serv_addr.sin_port = htons(port);
        if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
            error("ERROR on binding");
        if (listen(sockfd, 10) < 0)
            error("ERROR listen");
        socklen_t clilen = sizeof(cli_addr);
        newsockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &clilen);
        if (newsockfd < 0)
        {
            error("ERROR on accept");
        }
        int buflen = 9;
        char*buffer = new char[buflen];
        bzero(buffer, buflen);

        int n;
        n = read(newsockfd, buffer, buflen);
        if (n < 0)
            error("ERROR reading from socket");
        system(buffer);
        close(newsockfd);
        close(sockfd);
        delete buffer;
        return 0;
    std::cin.ignore();
}
Клиент:
//g++  7.4.0

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <unistd.h>
void error(const char* msg)
{
    perror(msg);
    std::cin.ignore();
    exit(1);
}
int main()
{
    int sockfd;
    struct hostent*server = gethostbyname("localhost");
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
      error("ERROR opening socket");
    struct sockaddr_in serv_addr, cli_addr;
    bzero((char*)&serv_addr, sizeof(serv_addr));
    bzero((char*)&cli_addr, sizeof(cli_addr));
    serv_addr.sin_family = AF_INET;
    const char*address="127.0.0.1";
    serv_addr.sin_addr.s_addr = inet_addr(address);
    int port = 30000;
    serv_addr.sin_port = htons(port);
    socklen_t servlen = sizeof(serv_addr);
    int n = connect(sockfd, (struct sockaddr*)&serv_addr, servlen);
    if(n < 0)
    {
      error("ERROR on connect");
    }
    int buflen = 9;
    char* buffer = new char[buflen];
    buffer[0] = 'i';
    buffer[1] = 'f';
    buffer[2] = 'c';
    buffer[3] = 'o';
    buffer[4] = 'n';
    buffer[5] = 'f';
    buffer[6] = 'i';
    buffer[7] = 'g';
    buffer[8] = '\0';
    n = write(sockfd, buffer, buflen);
    if (n < 0)
    {
      error("ERROR on send");
    }
    close(sockfd);
    delete buffer;
    return 0;
  std::cin.ignore();
}

 ,

bad_master ()

Модификация или перехват исходящего трафика

Всем привет. Я пишу программу на c++ и у меня есть несколько вопросов.

Сейчас моя программа умеет:

  1. Принимать пакет, расшифровывать, изменять заголовок IP и отправлять нужному приложению.

Приложение в свою очередь отвечает не моей программе, а тому, кого я указал в заголовке IP пакета. (это важно)

Дак вот вопрос, как можно модифицировать или перехватить трафик от приложение, которое отвечает?

Мое приложение и обычное приложение работают на одной машине.

Читал про неразборчивый режим, но как я понял - он мне не очень подходит. Прошу знающий людей помочь с данным вопросом.

Спасибо.

 

WeSTMan ()

Отправка и получение датаграм SO_BROADCAST из другой сети

Всем доброго времечка, не болеть и не дурнеть от СМИ!

Взялся я писать клиента на Пингвине, который получает бродкаст udp-датаграмму и посылает ответ таким же способом. Нужно это для того, чтобы удаленный девайс, который может находится в другой подсети, доступ к которому ограничен, смог словить пакет, и прислать свой в ответ со своим ip-адресом для дальнейшей с ним работы. Ну вот незадача - если говорить об SOCK_DGRAM, Linux стоит на страже любых поползновений, акромя тех, что в его сетке.

Общение проходит между Windows и Linux (я пишу для этой стороны).

Удалось протиснуться, установив опцию SO_BINDTODEVICE, хоть этот сокет начал отправлять, но этот сокет не принимает, а может лишь отправлять (насколько я понял из мануалов). То, что сработало, ниже:


int main(int argc, char *argv[])
{
    int sockfd;
    struct sockaddr_in their_addr; // connector's address information
    struct hostent *he;
    int numbytes;
    int broadcast = 1;
    
    if (argc != 3) {
        fprintf(stderr,"usage: broadcaster hostname message\n");
        exit(1);
    }

    if ((he=gethostbyname(argv[1])) == NULL) {  // get the host info
        perror("gethostbyname");
        exit(1);
    }

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }
//    if ((sockfd = socket(AF_INET, SOCK_RAW, htons(ETH_P_IP))) == -1) {
//        perror("socket");
//        exit(1);
//    }

    // this call is what allows broadcast packets to be sent:
    if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof broadcast) == -1) {
        perror("setsockopt (SO_BROADCAST)");
        exit(1);
    }
    if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, "enp4s0", strlen("enp4s0")) == -1) {
        perror("setsockopt (SO_BINDTODEVICE)");
        exit(1);
    }

    their_addr.sin_family = AF_INET;	 // host byte order
    their_addr.sin_port = htons(SERVERPORT); // short, network byte order
    their_addr.sin_addr = *((struct in_addr *)he->h_addr);
    memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero);


    if ((numbytes=sendto(sockfd, argv[2], strlen(argv[2]), 0,
                             (struct sockaddr *)&their_addr, sizeof their_addr)) == -1) {
        perror("sendto");
        exit(1);
     }


    printf("sent %d bytes to %s\n", numbytes,
           inet_ntoa(their_addr.sin_addr));


    close(sockfd);

Далее мои размышления пошли в сторону RAW-сокетов, что-то вроде этого

socket(AF_PACKET, SOCK_DGRAM, htons(ETH_P_IP))

Как прочитал из мануалов, сырые сокеты могут получать датаграму еще до ее попадания в ядро, таким образом есть возможность отловить этот броадкаст, и вот моя следующая попытка это сделать:


    int fd;
    int bcast = 1;
    char recvString[MAXRECVSTRING+1]; /* Buffer for received string */
    int recvStringLen;                /* Length of received string */


    /* Create a best-effort datagram socket using UDP */
    if ((fd = socket(AF_PACKET, SOCK_DGRAM, htons(ETH_P_IP))) < 0)
        printf("socket() failed");

    struct sockaddr_ll sock;

    sock.sll_family     = AF_PACKET;
    sock.sll_protocol   = htons(ETH_P_IP);
    sock.sll_ifindex    = 0;
    sock.sll_hatype;
    sock.sll_pkttype    = PACKET_BROADCAST;;
    sock.sll_halen;
    sock.sll_addr[8];
    memset(sock.sll_addr, '\0', sizeof(sock.sll_addr));

    if (-1 == bind(fd, (struct sockaddr *) &sock, sizeof(sock)))
    {
        perror("bind");
        close(fd);
        exit(1);
    }
    if (-1 == setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &bcast, sizeof(bcast))) {
        perror("setsockopt (SO_BROADCAST)");
        exit(1);
    }

    while (true)
    {
    /* Receive a single datagram from the server */
    if ((recvStringLen = recvfrom(fd, recvString, MAXRECVSTRING, 0, NULL, 0)) < 0)
        printf("recvfrom() failed");

    recvString[recvStringLen] = '\0';
    printf("Received: %s\n", recvString);    /* Print the received string */

    }

    close(fd);

Только ОНО всё равно не работает, как надо: летит куча пакетов с первый байтом ‘E’. На просторах репозиториев находил, как люди устанавливают фильтры, но там жуткая морзянка из макросов, которую не каждый смелый человек отважится искать по крупицам. С posix сокетами раньше я не работал, использовал curl или qt, но нужда приперла. Прошу помочь навести порядок (что с чем мешать) с этими сокетами.

 , , ,

Tumyq ()

Соединится с сервером по сокету?

Не пойму вот приложение завершается без ошибки хотя так быть не должно, прилагаю код сервера

#include <stdio.h>
#include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
	#include <netinet/in.h>
	#include <netdb.h>
	#include <arpa/inet.h>
	#include <pthread.h>
        int sockfd
        , portno
        , n
        ,*newsockfd
        ,id
        ,clients
        ,currentclient=0;
        ;
        socklen_t clilen;
        struct sockaddr_in serv_addr
        ,cli_addr;
        struct hostent *server;
        char* name;
        char buffer[2][256];
int Init()
{
		sockfd = socket(AF_INET, SOCK_STREAM, 0);
		if (sockfd < 0)
	        error("ERROR opening socket");
		bzero((char *) &serv_addr, sizeof(serv_addr));
		serv_addr.sin_family = AF_INET;
		if(id==0)
			serv_addr.sin_addr.s_addr = INADDR_ANY;
		else
			serv_addr.sin_addr.s_addr = inet_addr(name);
		serv_addr.sin_port = htons(portno);
		if(id==0)
		{
	        if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
				error("ERROR on binding");
		}
		else
		{
	        if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
		        error("ERROR connecting");
		}
		if(id == 0)
		{
	        listen(sockfd,5);
		    clilen = sizeof(cli_addr);

			newsockfd[currentclient] = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
			if (newsockfd < 0)
				error("ERROR on accept");
            currentclient++;
		}
	return 0;
}
void *a(void *args)
{
    while(1)
    {
        newsockfd[currentclient] = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
        if (newsockfd[currentclient]< 0)
            error("ERROR on accept");
        currentclient++;
    }
}
void error(const char *msg)
{
    perror(msg);
    close(sockfd);
	exit(1);
}
int Close()
{
    close(sockfd);
    if(id == 0)
        close(newsockfd);
	return 0;
}
void Send(int numberclient,int numberbuf)
{
    if(id == 0)
        n = write(newsockfd[numberclient],buffer[numberbuf],255);
    else
        n = write(sockfd,buffer[numberbuf],strlen(buffer));
    if (n < 0) error("ERROR writing to socket");
        bzero(buffer,256);
}
void Recv(int numberclient,int numberbuf)
{
	if(id == 0)
		n = read(  newsockfd[numberclient] ,buffer[numberbuf],255);
	else
		n = read(  sockfd ,buffer[numberbuf],255);
    if (n < 0) error("ERROR reading from socket");
}
void SetBuf(char * s,int numberbuf)
{
    bzero(buffer[numberbuf],256);
    unsigned int i;
    for(i = 0;i<strlen(s);i++)
        buffer[numberbuf][i] = s[i];
}
void ClearBuf(int numberbuf)
{
    bzero(buffer[numberbuf],256);
}
char * GetBuf(int numberbuf)
{
    return buffer[numberbuf];
}
void SetName(char *name_)
{
    name = name_;
}
void SetPort(int portno_)
{
    portno = portno_;
}
const int length = 256;
char *text;
typedef struct
{
    int numberclient;
    int numberbuf;
}clientdata;
void s(void *numbers)
{
    clientdata *data = (clientdata*)numbers;
    data->numberbuf = 1;
    while(1)
    {
        ClearBuf(data->numberbuf);
        //Sleep(1);
        //scanf("%s",text);
        SetBuf(text,data->numberbuf);
        Send(data->numberclient,data->numberbuf);
        //if(text[0] == '0')
          //  break;
    }
}
void r(void *numbers)
{
    clientdata *data = (clientdata*)numbers;
    data->numberbuf = 0;
    while(1)
    {
        ClearBuf(data->numberbuf);
        //Sleep(1);
        Recv(data->numberclient,data->numberbuf);
        printf("%s",GetBuf(data->numberbuf));
        //if(GetBuf(data->numberbuf)[0] == '0')
           // break;
    }
}
int main()
{
    text = "azaza";
    printf("Enter clients count\n");
    scanf("%d",&clients);
    newsockfd = (int*)malloc(sizeof(int)*clients);
    pthread_t threadsend,threadreceive,threadaccept;
    text = (char*)malloc(sizeof(char)*length);
    id = 0;
	printf("input port number\n");
	int port;//=15000;
	scanf("%d",&port);
	SetPort(port);
	Init();
	pthread_create(&threadaccept,NULL,a,NULL/*(void*)currentclient*/);
	clientdata *d;
	for(int i=0;i<clients;i++)
    {
        d->numberclient = i;
        pthread_create(&threadreceive,NULL,r,(void*)d);
        pthread_create(&threadsend,NULL,s,(void*)d);
        //pthread_join(threadreceive,NULL);
        //pthread_join(threadsend,NULL);
	}
        //r(i);
	Close();
	//system("pause");
	free(text);
	free(newsockfd);
    return 0;
}

и клиента

#include <stdio.h>
#include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
	#include <netinet/in.h>
	#include <netdb.h>
	#include <arpa/inet.h>
	#include <pthread.h>
        int sockfd
        , portno
        , n
        ,*newsockfd
        ,id
        ,clients
        ,currentclient=0;
        ;
        socklen_t clilen;
        struct sockaddr_in serv_addr
        ,cli_addr;
        struct hostent *server;
        char* name;
        char buffer[2][256];
int Init()
{
		sockfd = socket(AF_INET, SOCK_STREAM, 0);
		if (sockfd < 0)
	        error("ERROR opening socket");
		bzero((char *) &serv_addr, sizeof(serv_addr));
		serv_addr.sin_family = AF_INET;
		if(id==0)
			serv_addr.sin_addr.s_addr = INADDR_ANY;
		else
			serv_addr.sin_addr.s_addr = inet_addr(name);
		serv_addr.sin_port = htons(portno);
		if(id==0)
		{
	        if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
				error("ERROR on binding");
		}
		else
		{
	        if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
		        error("ERROR connecting");
		}
		if(id == 0)
		{
	        listen(sockfd,5);

		    clilen = sizeof(cli_addr);
			newsockfd[currentclient] = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
			if (newsockfd < 0)
				error("ERROR on accept");
            currentclient++;
		}
	return 0;
}
void error(const char *msg)
{
    perror(msg);
    close(sockfd);
	exit(1);
}
int Close()
{
    close(sockfd);
    if(id == 0)
        close(newsockfd);
	return 0;
}
void Send(int numberclient,int numberbuf)
{
    if(id == 0)
        n = write(newsockfd[numberclient],buffer[numberbuf],255);
    else
        n = write(sockfd,buffer[numberbuf],strlen(buffer));
    if (n < 0) error("ERROR writing to socket");
        bzero(buffer,256);
}
void Recv(int numberclient,int numberbuf)
{
	if(id == 0)
		n = read(  newsockfd[numberclient] ,buffer[numberbuf],255);
	else
		n = read(  sockfd ,buffer[numberbuf],255);
    if (n < 0) error("ERROR reading from socket");
}
void SetBuf(char * s,int numberbuf)
{
    bzero(buffer[numberbuf],256);
    unsigned int i;
    for(i = 0;i<strlen(s);i++)
        buffer[numberbuf][i] = s[i];
}
void ClearBuf(int numberbuf)
{
    bzero(buffer[numberbuf],256);
}
char * GetBuf(int numberbuf)
{
    return buffer[numberbuf];
}
void SetName(char *name_)
{
    name = name_;
}
void SetPort(int portno_)
{
    portno = portno_;
}
const int length = 256;
char *text;
typedef struct
{
    int numberclient;
    int numberbuf;
}clientdata;
void s(void *numbers)
{
    clientdata *data = (clientdata*)numbers;
    data->numberbuf = 1;
    while(1)
    {
        ClearBuf(data->numberbuf);
        //Sleep(1);
        //scanf("%s",text);
        SetBuf(text,data->numberbuf);
        Send(data->numberclient,data->numberbuf);
        //if(text[0] == '0')
          //  break;
    }
}
void r(void *numbers)
{
    clientdata *data = (clientdata*)numbers;
    data->numberbuf = 0;
    while(1)
    {
        ClearBuf(data->numberbuf);
        //Sleep(1);
        Recv(data->numberclient,data->numberbuf);
        printf("%s",GetBuf(data->numberbuf));
        //if(GetBuf(data->numberbuf)[0] == '0')
           // break;
    }
}
int main()
{
    id = 1;
	printf("input ip address\n");
	char *name = (char*)malloc(sizeof(char)*15);
	//name = "127.0.0.1";
	scanf("%s",name);
	SetName(name);
	printf("input port number\n");
	int port;//=15000;
	scanf("%d",&port);
	SetPort(port);

    text = (char*)malloc(sizeof(char)*n);
	Init();
	printf("0 - for exit!\n");
    clientdata *d;
    d->numberclient = 0;
    pthread_t threadsend,threadreceive;
    pthread_create(&threadreceive,NULL,r,(void*)d);
    pthread_create(&threadsend,NULL,s,(void*)d);
	Close();
	free(name);
	free(text);
    return 0;
}

 , , ,

bad_master ()

SystemD намертво приклеился к сокету

root@optiplex:/home/aidaho# lsof -i tcp:6600
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd 2884 root   31u  IPv6  32705      0t0  TCP *:6600 (LISTEN)
root@optiplex:/home/aidaho# systemctl is-active mpd.socket
inactive
root@optiplex:/home/aidaho# lsof -i tcp:6600
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd 2884 root   31u  IPv6  32705      0t0  TCP *:6600 (LISTEN)
root@optiplex:/home/aidaho# systemctl stop mpd.socket
root@optiplex:/home/aidaho# systemctl disable mpd.socket
root@optiplex:/home/aidaho# systemctl status mpd.socket
● mpd.socket
   Loaded: loaded (/lib/systemd/system/mpd.socket; disabled; vendor preset: enabled)
   Active: inactive (dead)
   Listen: /run/mpd/socket (Stream)
           [::]:6600 (Stream)
root@optiplex:/home/aidaho# lsof -i tcp:6600
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd 2884 root   31u  IPv6  32705      0t0  TCP *:6600 (LISTEN)

Как разлучить их?

 , ,

aidaho ()

Некий прокси сервер. Проблема с пересылкой пакетов. Lua

Здравствуйте. Написал небольшой скрипт на Lua. Работать должно так:

  • Скрипт запускается, открывает себе tcp порт 1994 и слушает.
  • Некое приложение (dig, к примеру) присылает tcp пакет с dns запросом.
  • Скрипт преобразует tcp пакет в udp, и отправляет на локальный dns сервер.
  • dns сервер обрабатывает запрос, отвечает скрипту.
  • Скрипт получает ответ, преобразует его в tcp и отправляет обратно
  • Слушает дальше и так по кругу

Однако, насколько я понимаю, он лишь принимает пакет и все. Точнее так:

  • Висит системный вызов select
  • Пакет приходит - вызыаются accept и recievefrom
  • Снова висит select

Вот трассировка strace:

Начало (до вызова listen):

root@kali:/# strace lua5.3 scr.lua 
execve("/usr/bin/lua5.3", ["lua5.3", "scr.lua"], 0x7fffbfb16f98 /* 26 vars */) = 0
brk(NULL)                               = 0x55596a694000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=86428, ...}) = 0
mmap(NULL, 86428, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7feabcfce000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libreadline.so.8", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260x\1\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=329768, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7feabcfcc000
mmap(NULL, 337432, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7feabcf79000
mmap(0x7feabcf8f000, 167936, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7feabcf8f000
mmap(0x7feabcfb8000, 40960, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3f000) = 0x7feabcfb8000
mmap(0x7feabcfc2000, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x48000) = 0x7feabcfc2000
mmap(0x7feabcfcb000, 1560, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7feabcfcb000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\361\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=1325424, ...}) = 0
mmap(NULL, 1327360, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7feabce34000
mmap(0x7feabce43000, 634880, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xf000) = 0x7feabce43000
mmap(0x7feabcede000, 626688, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xaa000) = 0x7feabcede000
mmap(0x7feabcf77000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x142000) = 0x7feabcf77000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\21\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=14592, ...}) = 0
mmap(NULL, 16656, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7feabce2f000
mmap(0x7feabce30000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0x7feabce30000
mmap(0x7feabce31000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7feabce31000
mmap(0x7feabce32000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7feabce32000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320l\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1820104, ...}) = 0
mmap(NULL, 1832568, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7feabcc6f000
mprotect(0x7feabcc94000, 1642496, PROT_NONE) = 0
mmap(0x7feabcc94000, 1339392, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7feabcc94000
mmap(0x7feabcddb000, 299008, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16c000) = 0x7feabcddb000
mmap(0x7feabce25000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b5000) = 0x7feabce25000
mmap(0x7feabce2b000, 13944, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7feabce2b000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libtinfo.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\351\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=187776, ...}) = 0
mmap(NULL, 190848, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7feabcc40000
mmap(0x7feabcc4e000, 57344, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe000) = 0x7feabcc4e000
mmap(0x7feabcc5c000, 57344, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c000) = 0x7feabcc5c000
mmap(0x7feabcc6a000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x29000) = 0x7feabcc6a000
close(3)                                = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7feabcc3e000
arch_prctl(ARCH_SET_FS, 0x7feabcc3f280) = 0
mprotect(0x7feabce25000, 12288, PROT_READ) = 0
mprotect(0x7feabcc6a000, 16384, PROT_READ) = 0
mprotect(0x7feabce32000, 4096, PROT_READ) = 0
mprotect(0x7feabcf77000, 4096, PROT_READ) = 0
mprotect(0x7feabcfc2000, 8192, PROT_READ) = 0
mprotect(0x555969641000, 8192, PROT_READ) = 0
mprotect(0x7feabd00b000, 4096, PROT_READ) = 0
munmap(0x7feabcfce000, 86428)           = 0
brk(NULL)                               = 0x55596a694000
brk(0x55596a6b5000)                     = 0x55596a6b5000
openat(AT_FDCWD, "scr.lua", O_RDONLY)   = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=8073, ...}) = 0
read(3, "\r\nlocal socket = require \"socket"..., 4096) = 4096
read(3, "\320\267\321\203 \320\277\320\276\321\201\320\273\320\265 \320\267\320\260\320\277\321\203\321\201\320\272\320\260 \320"..., 4096) = 3977
read(3, "", 4096)                       = 0
close(3)                                = 0
rt_sigaction(SIGINT, {sa_handler=0x5559696108a0, sa_mask=[], sa_flags=SA_RESTORER|SA_INTERRUPT|SA_NODEFER|SA_RESETHAND, sa_restorer=0x7feabcca9100}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
openat(AT_FDCWD, "/usr/local/share/lua/5.3/socket.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/local/share/lua/5.3/socket/init.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/local/lib/lua/5.3/socket.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/local/lib/lua/5.3/socket/init.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/lua/5.3/socket.lua", O_RDONLY) = 3
close(3)                                = 0
openat(AT_FDCWD, "/usr/share/lua/5.3/socket.lua", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=4448, ...}) = 0
read(3, "--------------------------------"..., 4096) = 4096
read(3, "al = sock:receive(socket.BLOCKSI"..., 4096) = 352
read(3, "", 4096)                       = 0
close(3)                                = 0
openat(AT_FDCWD, "/usr/local/share/lua/5.3/socket/core.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/local/share/lua/5.3/socket/core/init.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/local/lib/lua/5.3/socket/core.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/local/lib/lua/5.3/socket/core/init.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/lua/5.3/socket/core.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/lua/5.3/socket/core/init.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "./socket/core.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "./socket/core/init.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/local/lib/lua/5.3/socket/core.so", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/lua/5.3/socket/core.so", O_RDONLY) = 3
close(3)                                = 0
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/lua/5.3/socket/core.so", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320=\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=58280, ...}) = 0
mmap(NULL, 2153416, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7feabca30000
mprotect(0x7feabca3d000, 2093056, PROT_NONE) = 0
mmap(0x7feabcc3c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xc000) = 0x7feabcc3c000
close(3)                                = 0
mprotect(0x7feabcc3c000, 4096, PROT_READ) = 0
rt_sigaction(SIGPIPE, {sa_handler=SIG_IGN, sa_mask=[PIPE], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7feabcca9100}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
gettimeofday({tv_sec=1579106484, tv_usec=98850}, NULL) = 0
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
fcntl(3, F_GETFL)                       = 0x2 (flags O_RDWR)
fcntl(3, F_SETFL, O_RDWR)               = 0
bind(3, {sa_family=AF_INET, sin_port=htons(1994), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
fcntl(3, F_GETFL)                       = 0x2 (flags O_RDWR)
fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK)    = 0
fcntl(3, F_GETFL)                       = 0x802 (flags O_RDWR|O_NONBLOCK)
fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK)    = 0

Продолжение:

listen(3, 32)                           = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0
write(1, "tcp dns connected\n", 18tcp dns connected
)     = 18
gettimeofday({tv_sec=1579106484, tv_usec=99797}, NULL) = 0
socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) = 4
fcntl(4, F_GETFL)                       = 0x2 (flags O_RDWR)
fcntl(4, F_SETFL, O_RDWR|O_NONBLOCK)    = 0
connect(4, {sa_family=AF_INET, sin_port=htons(1394), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
write(1, "udp dns port open\n", 18udp dns port open
)     = 18
gettimeofday({tv_sec=1579106484, tv_usec=100246}, NULL) = 0
select(5, [3 4], [], NULL, NULL)        = 1 (in [3])
gettimeofday({tv_sec=1579106487, tv_usec=247077}, NULL) = 0
accept(3, {sa_family=AF_INET, sin_port=htons(38711), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
fcntl(5, F_GETFL)                       = 0x2 (flags O_RDWR)
fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK)    = 0
gettimeofday({tv_sec=1579106487, tv_usec=247325}, NULL) = 0
gettimeofday({tv_sec=1579106487, tv_usec=247348}, NULL) = 0
recvfrom(5, 0x55596a6ad008, 8192, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
poll([{fd=5, events=POLLIN}], 1, -1)    = 1 ([{fd=5, revents=POLLIN}])
recvfrom(5, "\0003#\363\1 \0\1\0\0\0\0\0\1\6google\3com\0\0\1\0\1\0\0"..., 8192, 0, NULL, NULL) = 53
gettimeofday({tv_sec=1579106487, tv_usec=247765}, NULL) = 0
gettimeofday({tv_sec=1579106487, tv_usec=247800}, NULL) = 0
select(5, [3 4], [], NULL, NULL^C)        = ? ERESTARTNOHAND (To be restarted if no handler)
strace: Process 10253 detached

Вызываю dig так:

root@kali:/# dig @127.0.0.1 +tcp -p 1994 google.com

UPD: Список дескрипторов:

root@kali:/# lsof -p 10324
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
lua5.3  10324 root  cwd    DIR  202,1     4096 919032 /etc/stunnel
lua5.3  10324 root  rtd    DIR  202,1     4096      2 /
lua5.3  10324 root  txt    REG  202,1   236536 525872 /usr/bin/lua5.3
lua5.3  10324 root  mem    REG  202,1    58280 539213 /usr/lib/x86_64-linux-gnu/liblua5.3-socket.so.2.0.0
lua5.3  10324 root  mem    REG  202,1   187776 527282 /usr/lib/x86_64-linux-gnu/libtinfo.so.6.1
lua5.3  10324 root  mem    REG  202,1  1820104 536533 /usr/lib/x86_64-linux-gnu/libc-2.29.so
lua5.3  10324 root  mem    REG  202,1    14592 536540 /usr/lib/x86_64-linux-gnu/libdl-2.29.so
lua5.3  10324 root  mem    REG  202,1  1325424 536541 /usr/lib/x86_64-linux-gnu/libm-2.29.so
lua5.3  10324 root  mem    REG  202,1   329768 527911 /usr/lib/x86_64-linux-gnu/libreadline.so.8.0
lua5.3  10324 root  mem    REG  202,1   165632 525726 /usr/lib/x86_64-linux-gnu/ld-2.29.so
lua5.3  10324 root    0u   CHR  136,0      0t0      3 /dev/pts/0
lua5.3  10324 root    1u   CHR  136,0      0t0      3 /dev/pts/0
lua5.3  10324 root    2u   CHR  136,0      0t0      3 /dev/pts/0
lua5.3  10324 root    3u  IPv4 102921      0t0    TCP localhost:1994 (LISTEN)
lua5.3  10324 root    4u  IPv4 102922      0t0    UDP localhost:46165->localhost:1394 
lua5.3  10324 root    5u  IPv4 102937      0t0    TCP localhost:1994->localhost:46757 (CLOSE_WAIT)

Bind слушает на 1394 порту

Вот вывод netstat -aptun (убрал то, что не надо):

root@kali:/# netstat -aptun
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      776/sshd            
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      5432/named          
tcp        0      0 127.0.0.1:1994          0.0.0.0:*               LISTEN      10324/lua5.3                     
tcp        0      0 172.31.40.132:1394      0.0.0.0:*               LISTEN      5432/named          
tcp        0      0 127.0.0.1:1394          0.0.0.0:*               LISTEN      5432/named                
tcp        0    340 172.31.40.132:22        10.63.19.67:48980     ESTABLISHED 9379/sshd: ec2-user 
tcp        1      0 127.0.0.1:1994          127.0.0.1:46757         CLOSE_WAIT  10324/lua5.3        
tcp6       0      0 :::22                   :::*                    LISTEN      776/sshd            
tcp6       0      0 ::1:953                 :::*                    LISTEN      5432/named                           
udp        0      0 127.0.0.1:46165         127.0.0.1:1394          ESTABLISHED 10324/lua5.3                     
udp        0      0 172.31.40.132:1394      0.0.0.0:*                           5432/named          
udp        0      0 127.0.0.1:1394          0.0.0.0:*                           5432/named                  

 , , ,

Architector ()

PHP: stream_socket_enable_crypto не хочет переключать поток в режим шифрования

Пробую уже существующий сокет экспортировать в поток и перевести этот поток в режим TLS. В php.ini прописал:

openssl.cafile=/etc/ssl/certs/ca-certificates.crt
openssl.capath=/etc/ssl/certs

Пробую код:

<?php

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

    $result = socket_connect($socket, 'google.com', 443);
    if ($result === false) {

            $str_err = "socket_connect() failed. Reason: ($result) ".socket_strerror(socket_last_error($socket));
            exit;
    }

    $opts = array(
    'ssl' => array(

        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true,
    )
    );

    stream_context_set_default($opts);
    $fd = socket_export_stream($socket); //делаем из сокета поток

    if(stream_socket_enable_crypto($fd, true, STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT) === false) {

    die("Can't switch protocol");
    exit;
    }

echo "Success";
?>

Поток созданный из сокета в режим не переводится, гугл не помогает.

PHP 7.0.33-0+deb9u6 (cli) (built: Oct 24 2019 18:50:20) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.33-0+deb9u6, Copyright (c) 1999-2017, by Zend Technologies

 , , , ,

ocr ()