Форум программистов, компьютерный форум, киберфорум
Lua
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 12.01.2020
Сообщений: 11

Сетевые сокеты. Этакий прокси сервер. Не пересылает пакеты

14.01.2020, 21:07. Показов 817. Ответов 0
Метки lua (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Написал небольшой скрипт на Lua.
Работать должно так:
  • Скрипт запускается, открывает себе tcp порт 1994 и слушает.
  • Некое локальное приложение присылает tcp пакет с dns запросом.
  • Скрипт преобразует tcp пакет в udp, и отправляет на локальный dns сервер.
  • dns сервер обрабатывает запрос, отвечает скрипту.
  • Скрипт получает ответ, преобразует его обратно в tcp и отправляет
  • Слушает дальше и так по кругу

Однако, насколько я понимаю, он лишь принимает пакет и все.
Точнее так:
  • Висит системный вызов select
  • Пакет приходит - вызыаются accept и recievefrom
  • Снова висит select

Вот трассировка с помощью strace (у меня linux):
Здесь неинтересное начало трассировки (а может и интересное):
Кликните здесь для просмотра всего текста

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
root@kali:/etc/stunnel# strace lua5.3 scr.lua 
execve("/usr/bin/lua5.3", ["lua5.3", "scr.lua"], 0x7ffcbb5d02e8 /* 26 vars */) = 0
brk(NULL)                               = 0x55f840d00000
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) = 0x7f5390637000
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) = 0x7f5390635000
mmap(NULL, 337432, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f53905e2000
mmap(0x7f53905f8000, 167936, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7f53905f8000
mmap(0x7f5390621000, 40960, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3f000) = 0x7f5390621000
mmap(0x7f539062b000, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x48000) = 0x7f539062b000
mmap(0x7f5390634000, 1560, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f5390634000
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) = 0x7f539049d000
mmap(0x7f53904ac000, 634880, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xf000) = 0x7f53904ac000
mmap(0x7f5390547000, 626688, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xaa000) = 0x7f5390547000
mmap(0x7f53905e0000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x142000) = 0x7f53905e0000
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) = 0x7f5390498000
mmap(0x7f5390499000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0x7f5390499000
mmap(0x7f539049a000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f539049a000
mmap(0x7f539049b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f539049b000
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) = 0x7f53902d8000
mprotect(0x7f53902fd000, 1642496, PROT_NONE) = 0
mmap(0x7f53902fd000, 1339392, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7f53902fd000
mmap(0x7f5390444000, 299008, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16c000) = 0x7f5390444000
mmap(0x7f539048e000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b5000) = 0x7f539048e000
mmap(0x7f5390494000, 13944, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f5390494000
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) = 0x7f53902a9000
mmap(0x7f53902b7000, 57344, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe000) = 0x7f53902b7000
mmap(0x7f53902c5000, 57344, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c000) = 0x7f53902c5000
mmap(0x7f53902d3000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x29000) = 0x7f53902d3000
close(3)                                = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f53902a7000
arch_prctl(ARCH_SET_FS, 0x7f53902a8280) = 0
mprotect(0x7f539048e000, 12288, PROT_READ) = 0
mprotect(0x7f53902d3000, 16384, PROT_READ) = 0
mprotect(0x7f539049b000, 4096, PROT_READ) = 0
mprotect(0x7f53905e0000, 4096, PROT_READ) = 0
mprotect(0x7f539062b000, 8192, PROT_READ) = 0
mprotect(0x55f83fde0000, 8192, PROT_READ) = 0
mprotect(0x7f5390674000, 4096, PROT_READ) = 0
munmap(0x7f5390637000, 86428)           = 0
brk(NULL)                               = 0x55f840d00000
brk(0x55f840d21000)                     = 0x55f840d21000
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=0x55f83fdaf8a0, sa_mask=[], sa_flags=SA_RESTORER|SA_INTERRUPT|SA_NODEFER|SA_RESETHAND, sa_restorer=0x7f5390312100}, {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) = 0x7f5390099000
mprotect(0x7f53900a6000, 2093056, PROT_NONE) = 0
mmap(0x7f53902a5000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xc000) = 0x7f53902a5000
close(3)                                = 0
mprotect(0x7f53902a5000, 4096, PROT_READ) = 0
rt_sigaction(SIGPIPE, {sa_handler=SIG_IGN, sa_mask=[PIPE], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f5390312100}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
gettimeofday({tv_sec=1579023240, tv_usec=458443}, 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

Основная часть:
Кликните здесь для просмотра всего текста

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
listen(3, 32)                           = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0
write(1, "tcp dns ok\n", 18tcp dns ok
)     = 18
gettimeofday({tv_sec=1579023240, tv_usec=459418}, 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 щл\n", 18udp dns ok
)     = 18
gettimeofday({tv_sec=1579023240, tv_usec=459865}, NULL) = 0
select(5, [3 4], [], NULL, NULL)        = 1 (in [3])
gettimeofday({tv_sec=1579023247, tv_usec=373390}, NULL) = 0
accept(3, {sa_family=AF_INET, sin_port=htons(60166), 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=1579023247, tv_usec=373674}, NULL) = 0
gettimeofday({tv_sec=1579023247, tv_usec=373700}, NULL) = 0
recvfrom(5, 0x55f840d19008, 8192, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
poll([{fd=5, events=POLLIN}], 1, -1)    = 1 ([{fd=5, revents=POLLIN}])
recvfrom(5, "\0,\3\1\1 \0\1\0\0\0\0\0\1\1m\1m\0\0\1\0\1\0\0)\20\0\0\0\0\0"..., 8192, 0, NULL, NULL) = 46
gettimeofday({tv_sec=1579023272, tv_usec=559618}, NULL) = 0
gettimeofday({tv_sec=1579023272, tv_usec=559758}, NULL) = 0
select(5, [3 4], [], NULL, NULL^C)        = ? ERESTARTNOHAND (To be restarted if no handler)
strace: Process 5993 detached


А вот, собственно сам скрипт:
Кликните здесь для просмотра всего текста

Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
local socket = require "socket" -- подключаем lua socket
 
--[[--
 
Напишем простенькую функцию которая позволит отправить дамп пакета в консоль. Хочется видеть что делает прокси.
 
--]]--
 
function serialize(data)
    -- Преобразуем символы не входящие в диапазоны a-z и 0-9 и тире в HEX представление '\xFF'
    return "'"..data:gsub("[^a-z0-9-]", function(chr) return ("\\x%02X"):format(chr:byte()) end).."'"
end
 
--[[--
 
Пишем функцию которая вытащит имя домена из пакета и приведёт в удобочитаемую форму.
 
--]]--
 
function read_domain(packet)
    local pos = 14
    local dlen = packet:byte(13) -- читаем размер первой части имени домена
    local domain = {}
    while (dlen > 0) do -- 0 - озачает конец имени домена
        -- читаем часть имени домена
        table.insert(domain, packet:sub(pos, pos + dlen - 1)) 
        pos = pos + dlen + 1
        dlen = packet:byte(pos - 1) -- читаем размер следующёй части имени домена
    end
    return table.concat(domain, ".")
end
 
--[[--
 
UDP в TCP и обратно
 
Пишем две функции которые будут оперировать двумя каналами передачи данных.
 
--]]--
 
-- здесь пакеты из UDP пересылаются в TCP поток
function udp_to_tcp_coroutine_function(udp_in, tcp_out, clients)
    repeat
        coroutine.yield() -- возвращаем управление главному циклу
        packet, err_ip, port = udp_in:receivefrom() -- принимаем UDP пакет
        if packet then
            -- > - big endian
            -- I - unsigned integer
            -- 2 - 2 bytes size
            tcp_out:send(((">I2"):pack(#packet))..packet) -- добавляем размер пакета и отправляем в TCP
            local id = (">I2"):unpack(packet:sub(1,2))    -- читаем ID пакета
            if not clients[id] then
                clients[id] = {}
            end
            table.insert(clients[id] ,{ip=err_ip, port=port, packet=packet}) -- записываем адрес отправителя
            print(os.date("%c", os.time()) ,err_ip, port, ">", read_domain(packet), serialize(packet)) -- отображаем пакет в консоль
        print('tcp')
        end
    until false
end
 
-- здесь пакеты из TCP потока пересылаются к адресату по UDP
function tcp_to_udp_coroutine_function(tcp_in, udp_out, clients)
    repeat
        coroutine.yield() -- возврашяем управление главному циклу
        -- > - big endian
        -- I - unsigned integer
        -- 2 - 2 bytes size
    local input = tcp_in:accept();
 
        local packet = input:receive((">I2"):unpack(input:receive(2)), nil) -- принимаем TCP пакет
        local id = (">I2"):unpack(packet:sub(1,2))                            -- читаем ID пакета
                                  
        if clients[id] then
            for key, client in pairs(clients[id]) do
                -- сравниваем query в запросе и ответе
                if packet:find(client.packet:sub(13, -1), 13, true) == 13 then -- находим получателя
                    udp_out:sendto(packet, client.ip, client.port) -- отправляем пакет получателю по UDP
                    clients[id][key] = nil                         -- очищаем ячейку
                    -- отображаем пакет в консоль
                     print(os.date("%c", os.time()) ,client.ip, client.port, "<", read_domain(packet), serialize(packet)) 
                    print('udp')
                    break
                end
            end
            if not next(clients[id]) then
                clients[id] = nil
            end
        end
    until false
end
 
 
--[[--
 
Обе функции сразу после запуска выполняют coroutine.yield(). Это позволяет первым вызовом передать параметры функции а дальше делать coroutine.resume(co) без дополнительных параметров.
 
main
 
А теперь main функция которая выполнит подготовку и запустит главный цикл.
 
--]]--
 
function main()
    local tcpsock = socket.tcp() -- подготавливаем TCP сокет
    local udpsock = socket.udp() -- подготавливаем UDP сокет
 
    local tcp_connected = assert(tcpsock:bind("127.0.0.1", 1994)) -- открываем TCP прот
    local tcp_cn = tcpsock:listen()
    -- assert(tcp_connected, err) -- проверяем 
    print("tcp dns ok") -- сообщаем в консоль
 
    local udp_open, err = udpsock:setpeername("127.0.0.1", 1394) -- открываем UDP порт
    assert(udp_open, err)      -- проверяем что соединились
    print("udp dns ok") -- сообщаем что UDP соединено
 
    -- пользуемся тем что таблицы Lua позволяют использовать как ключ что угодно кроме nil
    -- используем как ключ сокет чтобы при наличии данных на нём вызывать его сопрограмму
    local coroutines = {
        [tcpsock] = coroutine.create(tcp_to_udp_coroutine_function), -- создаём сопрограмму TCP to UDP
        [udpsock] = coroutine.create(udp_to_tcp_coroutine_function)  -- создаём сопрограмму UDP to TCP
    }
 
    local clients = {} -- здесь будут записываться получатели пакетов
 
    -- передаём каждой сопрограмме сокеты и таблицу получателей
    coroutine.resume(coroutines[tcpsock], tcpsock, udpsock, clients) 
    coroutine.resume(coroutines[udpsock], udpsock, tcpsock, clients)
 
    -- таблица из которой socket.select будет выбирать сокет готовый к получению данных
    local socket_list = {tcpsock, udpsock} 
 
    repeat -- запускаем главный цикл
        -- socket.select выбирает из socket_list сокеты у которых есть данные на получение в буфере
        -- и возвращает новую таблицу с ними. Цикл for последовательно возвращает значения из новой таблицы  
        for _, in_socket in ipairs(socket.select(socket_list)) do
            -- запускаем ассоциированную с полученным сокетом сопрограмму
            local ok, err = coroutine.resume(coroutines[in_socket])
            if not ok then
                -- если сопрограмма завершилась с ошибкой то
                udpsock:close() -- закрываем UDP порт
                tcpsock:close() -- закрываем TCP соединение
                print(err) -- выводим ошибку
                return     -- завершаем главный цикл
            end
        end
    until false
end
 
 
--[[--
 
Запускаем главную функцию. Если вдруг будет закрыто соединение мы через секунду установим его заново вызвав main.
 
--]]--
 
repeat
    local ok, err = coroutine.resume(coroutine.create(main)) -- запускаем main
    if not ok then
        print(err)
    end
    socket.sleep(1) -- перед рестартом ждём одну секунду
until false
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.01.2020, 21:07
Ответы с готовыми решениями:

Сетевые сокеты. Этакий прокси сервер. Не пересылает пакеты. Lua
Здравствуйте. Написал небольшой скрипт на Lua. Работать должно так: Скрипт запускается, открывает себе tcp порт 1994 и...

Сокеты + прокси-сервер
Добрый день, уважаемые пользователи форума. Хотелось бы через сокеты обратиться к хосту, через прокси-сервер, насколько я знаю, нужно...

Перенаправить пакеты на прокси сервер программно
Всем привет. Известно, что некоторая программа отправляет пакеты на адрес 111.111.111.111. Необходимо перенаправить эти пакеты на прокси...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.01.2020, 21:07
Помогаю со студенческими работами здесь

Консольный чат. Почему сервер не пересылает сообщения клиентам?
пожалуйста помогите понять почему не работает мой консольный чат! сервер using System; using System.Collections.Generic; using...

Как использовать сетевые пакеты вместо IP?
в одной проге (конкурент) увидел в опциях выбор сетевых пакетов вместо IP. притом он это рекомендует и когда включаеш эту опцию, исчезает...

Как правильно передать сетевые пакеты на компьютер с Wireshark?
Доброе время суток, излазил поиск и гугл, ответа найти не смог. Дано: 1)Машина-1 с Windows7 на ней стоит Wireshark v1.10.0rc1. ...

Прокси сервер и прокси порт в android sdk manager
открываю android sdk manager, он пытается подключиться к интернетам, но у него не получается, т. к. Failed to fetch URL...

При передаче post запроса через прокси сервер в ответ приходят ошибки с прокси сервера
При передаче post запроса через прокси сервер в ответ прилетают ошибки с прокси сервера: &lt;p&gt;&lt;b&gt;Invalid Request&lt;/b&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru