Страница 1 из 2
прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-12 8:47:10
QweЯty
сильно сложное оное сделать?
а то сделал прогруммку для винды, но она парсила xml страничку апача... но апач не выдержал почти 2000 коннектов в одно и тоже время... и слег
(не считая гаджета, который даже хз, стоколько пользователей установило)
можно ли демона написать который слушал бы порт(указанный в конфиг файле, если возможно)
и отвечал, если с какого то ip пришел текст(запрос)....
на винде оказалось не сложно клиента написать...а вот как на bsd дело обстоит?
*не сложно... на протяжении месяца

Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-12 11:16:41
Alex Keda
нгинкс, наверное выдержал бы...
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-12 12:16:31
QweЯty
а демоном сложно будет?
раз уж быть широкопрофильным "специалистом" не могу... но дилетантом возможно:)
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-12 13:37:00
Гость
за час пишется такая смешная программка
только я не понял в чем вопрос, это вроде раздел С++ а не работа
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-12 23:03:14
QweЯty
ну в разделе языков программирования и пишу, потому сам буду писать, по крайней мере постараюсь...
а в разделе с++, вроде gcc это компилятор c++
или нет?
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-12 23:08:54
Гость
ну в разделе языков программирования и пишу, потому сам буду писать,
вообще раздел программирование это не блог
когда будете писать, и столкнетесь с трудностями или ошибками, их и пишите
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-13 2:27:20
QweЯty
на просторах инета нашел:
просто сервер который принимает символ инкрементирует его и возвращает (для пробы пера был сделан и рповерен телнетом) работает:
Код: Выделить всё
radist04ka@ cat tempdaemon.c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int err=-1;
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(9734);
server_len = sizeof(server_address);
err=(bind(server_sockfd, (struct sockaddr *) &server_address, server_len));
if(err!=0) printf("bind error!\n");
else printf("bind is ok\n");
err=-1;
err=(listen(server_sockfd, 5));
if(err!=0) printf("listen error!\n");
else printf("listen is ok\n");
while(1)
{
char ch;
printf("server waiting\n");
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, &client_len);
read(client_sockfd, &ch, 1);
ch++;
write(client_sockfd, &ch, 1);
close(client_sockfd);
}
}
radist04ka@
собралось без проблем:
Код: Выделить всё
radist04ka@ gcc -o TempRadik tempdaemon.c
radist04ka@ ls -l
total 12
drwxrwxr-x 2 radist www 512 13 фев 01:44 ./
drwxr-xr-x 9 radist www 1536 13 фев 01:20 ../
-rwxrwxr-x 1 radist www 6122 13 фев 01:33 TempRadik*
-rw-rw-r-- 1 radist www 1358 13 фев 01:21 tempdaemon.c
запускается тоже нормально, но не в фоне....
Код: Выделить всё
radist04ka@ ./TempRadik
bind is ok
listen is ok
также порт повидимому слушается:
Код: Выделить всё
radist04ka@ sockstat | grep Temp
radist TempRadik 97222 3 tcp4 *:9734 *:*
конекчусь:
Код: Выделить всё
radist04ka@ telnet 127.0.0.1 9734
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
f
gConnection closed by foreign host.
radist04ka@ telnet 127.0.0.1 9734
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
e
fConnection closed by foreign host.
radist04ka@ telnet 127.0.0.1 9734
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
j
kConnection closed by foreign host.
тут же в консоли выдает при вводе любой буквы в телнет:
Код: Выделить всё
radist04ka@ ./TempRadik
bind is ok
listen is ok
server waiting
server waiting
server waiting
server waiting
server waiting
server waiting
^C
честно так и не разобрался как сие работает,
что такое "инкриминирует"?
подразумаю замену символа:
потому что:
Код: Выделить всё
Escape character is '^]'.
f
g
Escape character is '^]'.
e
f
Escape character is '^]'.
j
k
а почему закрывает тогда соединение?
или так и должно?
но раз написано что работает, значит работает..
несколько вопросов:
как вывести номер порта в конфиг файл
как демоном запускать программу?
точнее как запускать демоном знаю, куда записать daemon(0,0); чтобы программа запускалась в фоне...
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-13 2:39:33
Гость
не понимаю как вы будете что то писать
а темболее говорите что написали под виндовс
если вообще даже в основах С/C++ не разбираетесь
что такое "инкриминирует"?
принявшийся символ увеличивается на единицу и отдается обратно
а почему закрывает тогда соединение?
ну так код смотрите
после отправки стоит close()
как вывести номер порта в конфиг файл
записать в конфиг?
чесно говоря не понимаю вопроса
это елементарно для программиста
как демоном запускать программу?
man daemon
?
точнее как запускать демоном знаю, куда записать daemon(0,0); чтобы программа запускалась в фоне...
там же в мане и пример должен быть
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-13 2:47:32
FreeBSP
в данном случае
символ - есть байт, а байт суть тип данных объемом один октет, один из битов которого выделен под знак, а остальные - под хранение целого значения
если ты не понял - перечитай выше написанное, считая количество прочтений следующим образом
Код: Выделить всё
int main() {
char a = 0;
while (a < 128) {
// прочитай написанное выше
++a;
}
return 0;
}
если программа завершается с кодом ошибки отличным от нуля - значит ты не постиг дзен символов. начни сначала
P.S. ночью хочется постебаться xD
P.P.S. char хранит один переменную, которая может интерпретироваться как код символа, а может - как числовое значение в пределах от -128 до 127. посему к нему можно применять все операци целочисленной арифметики, в частности инкремент.

P.P.P.S. для начала пойми, что есть суть "даемон" и только потом юзай высокоуровневую шелуху.
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-13 2:57:08
QweЯty
не успел написать как уже ответили..
нашел еще это:
Код: Выделить всё
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
// 2. Open socket for this SERVER
unlink("server_socket");
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
// 3. Socket name for SERVER
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(9734);
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
// 4. Connecting socket for SERVER
listen (server_sockfd, 5);
while(1) {
char *ch;
printf("server waiting\n");
// 5. I/O socket "SOCKFD"
client_len = sizeof (client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
read(client_sockfd, &ch, 1);
printf("%c , %d\n",ch,ch);
write(client_sockfd, &ch, 1);
close(client_sockfd);
}
}
работает так же:
Код: Выделить всё
radist04ka@ telnet 127.0.0.1 9734
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
pass
pConnection closed by foreign host.
radist04ka@ telnet 127.0.0.1 9734
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
bla bla bla
bConnection closed by foreign host.
radist04ka@
возвращает:
Код: Выделить всё
radist04ka@ ./TempR
server waiting
p , -1077941136
server waiting
b , -1077941150
server waiting
t , -1077941132
server waiting
^C
radist04ka@
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-13 3:12:16
QweЯty
а темболее говорите что написали под виндовс
парсинг xml по сравнению с этим....
Код: Выделить всё
не понимаю как вы будете что то писать
если вообще даже в основах С/C++ не разбираетесь
а мы такие:) ничего не умеем зато много можем... методом тыка проб и ошибок...
записать в конфиг?
чесно говоря не понимаю вопроса
это елементарно для программиста
совершенно с вами согласен

) с одной поправкой, я ни в коем случае не программист...
там же в мане и пример должен быть
покапаем, будем пробовать...
в данном случае
символ - есть байт, а байт суть тип данных объемом один октет, один из битов которого выделен под знак, а остальные - под хранение целого значения
если ты не понял - перечитай выше написанное, считая количество прочтений следующим образом
можно поподробнее и более понятным языком...
P.P.S. char хранит один переменную, которая может интерпретироваться как код символа, а может - как числовое значение в пределах от -128 до 127. посему к нему можно применять все операци целочисленной арифметики, в частности инкремент.
ниче не понял
P.S. ночью хочется постебаться
угу, а мне над самим собой уж как хочется...
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-13 12:21:52
FreeBSP
ты не постиг дзен символов xD
char это переменная длиной 8 битов. и ты можешь эти 8 битов использовать как твоей душе угодно. сумеешь в них запихнуть черта лысого - пожалуйста!
но по умолчанию - там хранится код символа - числовое значение - в пределах от -128 до 127
из кода
Код: Выделить всё
[12:13]~/# cat test.c
int main() {
char a[10]={ 0, 1, 2, 126, 127,-128, -127, -126, -2, -1};
return 0;
}
получается следующий ассемблерный код(размещение элементов массива в памяти):
Код: Выделить всё
mov byte ptr [ebp-0Eh], 0
mov byte ptr [ebp-0Dh], 1
mov byte ptr [ebp-0Ch], 2
mov byte ptr [ebp-0Bh], 7Eh
mov byte ptr [ebp-0Ah], 7Fh
mov byte ptr [ebp-9], 80h
mov byte ptr [ebp-8], 81h
mov byte ptr [ebp-7], 82h
mov byte ptr [ebp-6], 0FEh
mov byte ptr [ebp-5], 0FFh
последний столбец - есть как раз элементы массива. четко видно что за чем следует
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-13 16:11:47
QweЯty
вот:
сделан из двух исходников + один человек помог доделать
Код: Выделить всё
radist04ka@ cat tempd.c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main()
{
int err=-1;
int server_sockfd, client_sockfd;
int server_len, client_len;
int MAX_LINE_LEN;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(9734);
server_len = sizeof(server_address);
err=(bind(server_sockfd, (struct sockaddr *) &server_address, server_len));
if(err!=0) printf("bind error!\n");
else printf("bind is ok\n");
err=-1;
err=(listen(server_sockfd, 5));
if(err!=0) printf("listen error!\n");
else printf("listen is ok\n");
while(1)
{
char *path = filetest;
char buf[MAX_LINE_LEN];
FILE *file;
int nread;
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, &client_len);
nread = read(client_sockfd, &buf, sizeof(buf) - 1);
if (nread < 1) {
printf("read: %s. closing connection\n", strerror(errno));
close(client_sockfd);
continue;
}
buf[nread] = 0;
printf("server got: \"%s\"\n", buf);
if (strncmp(buf, "TEST", 4) == 0) {
strncpy(buf, "OK\n", sizeof(buf) -1);
buf[sizeof(buf) - 1] = 0;
} else if(strncmp(buf, "GETTEST", 7) == 0) {
file = fopen(path, "r");
if (file == NULL ||
fgets(buf, sizeof(buf), file) == NULL) {
strncpy(buf, "ERR\n", sizeof(buf) -1);
buf[sizeof(buf) - 1] = 0;
}
if (file)
fclose(file);
} else {
printf("bad command from client, closing connection\n");
close(client_sockfd);
continue;
}
printf("server answer: \"%s\"\n", buf);
write(client_sockfd, &buf, strlen(buf));
close(client_sockfd);
}
}
в консоли:
Код: Выделить всё
radist04ka@ sockstat | grep Temp
radist TempPrg 25008 3 tcp4 *:9734 *:*
radist04ka@ telnet 192.168.50.241 9734
Trying 192.168.50.241...
Connected to 192.168.50.241.
Escape character is '^]'.
test
Connection closed by foreign host.
radist04ka@ telnet 192.168.50.241 9734
TTrying 192.168.50.241...
Connected to 192.168.50.241.
Escape character is '^]'.
TEST
Connection closed by foreign host.
radist04ka@ telnet 192.168.50.241 9734
Trying 192.168.50.241...
Connected to 192.168.50.241.
Escape character is '^]'.
TEST
OK
Connection closed by foreign host.
radist04ka@ telnet 192.168.50.241 9734
Trying 192.168.50.241...
Connected to 192.168.50.241.
Escape character is '^]'.
TEST
OK
Connection closed by foreign host.
radist04ka@ telnet 192.168.50.241 9734
Trying 192.168.50.241...
Connected to 192.168.50.241.
Escape character is '^]'.
GETTEST
:99.9:99.9:99.9:999:999:88.88:Connection closed by foreign host.
radist04ka@ telnet 192.168.50.241 9734
Trying 192.168.50.241...
Connected to 192.168.50.241.
Escape character is '^]'.
GETTEST
:99.9:99.9:99.9:999:999:88.88:Connection closed by foreign host.
radist04ka@
в программе:
Код: Выделить всё
radist04ka@ ./TempPrg
bind is ok
listen is ok
server got: "test
"
bad command from client, closing connection
server got: "TTEST
"
bad command from client, closing connection
server got: "TEST
"
server answer: "OK
"
server got: "TEST
"
server answer: "OK
"
server got: "GETTEST
"
server answer: ":99.9:99.9:99.9:999:999:88.88:"
server got: "GETTEST
"
server answer: ":99.9:99.9:99.9:999:999:88.88:"
^C
radist04ka@
теперь, как вывести порт, название файла откуда строчку брать в конфиг-файл...
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-13 16:46:00
QweЯty
сделал так:
Код: Выделить всё
radist04ka@ cat tempd.c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main()
{
int err=-1;
int server_sockfd, client_sockfd;
int server_len, client_len;
int MAX_LINE_LEN;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(9734);
server_len = sizeof(server_address);
err=(bind(server_sockfd, (struct sockaddr *) &server_address, server_len));
if(err!=0) printf("bind error!\n");
else printf("bind is ok\n");
err=-1;
err=(listen(server_sockfd, 5));
if(err!=0) printf("listen error!\n");
else printf("listen is ok\n");
daemon(0,0);
while(1)
{
char *path = "filetest";
char buf[MAX_LINE_LEN];
FILE *file;
int nread;
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, &client_len);
nread = read(client_sockfd, &buf, sizeof(buf) - 1);
if (nread < 1) {
printf("read: %s. closing connection\n", strerror(errno));
close(client_sockfd);
continue;
}
buf[nread] = 0;
printf("server got: \"%s\"\n", buf);
if (strncmp(buf, "TEST", 4) == 0) {
strncpy(buf, "OK\n", sizeof(buf) -1);
buf[sizeof(buf) - 1] = 0;
} else if(strncmp(buf, "GETTEST", 7) == 0) {
file = fopen(path, "r");
if (file == NULL ||
fgets(buf, sizeof(buf), file) == NULL) {
strncpy(buf, "ERR\n", sizeof(buf) -1);
buf[sizeof(buf) - 1] = 0;
}
if (file)
fclose(file);
} else {
printf("bad command from client, closing connection\n");
close(client_sockfd);
continue;
}
printf("server answer: \"%s\"\n", buf);
write(client_sockfd, &buf, strlen(buf));
close(client_sockfd);
}
}
radist04ka@
честно говоря тока одно изменение:
Код: Выделить всё
else printf("listen is ok\n");
daemon(0,0);
while(1)
{
работать в фоне оно начало конечно...
но тут вылетает глюк:
Код: Выделить всё
Escape character is '^]'.
TEST
OK
Connection closed by foreign host.
проходит нормально
а вот:
Код: Выделить всё
Connected to 192.168.50.241.
Escape character is '^]'.
GETTEST
ERR
Connection closed by foreign host.
выводит ошибку...
как мне обьснили что daemon(0,0); надо писать всегда перед циклом... а почему тогда ругается...
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-13 17:58:59
QweЯty
это происходит из-за того что daemon запускается из /
а как тогда указать то что файл лежит рядом с бинарником, а не статично...
./ не помогло
как указать НЕ статический путь
или как вывести путь к файлу в конфиге? и как его вообще писать то....
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-13 22:39:47
FreeBSP
принимай в качестве параметра. осиль getopt.h. осиль fork()
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-14 5:23:31
QweЯty
Код: Выделить всё
daemon(0, 1);
while(1)
{
if ((f = open(".", O_RDONLY, 0)) == -1)
err(1, "open()");
if (fchdir(f) == -1)
err(1, "fchdir()");
сделал так:
и хоть и подключен
#include <errno.h>
ругается:
Код: Выделить всё
radist04ka@radist04ka@ gcc -o TempR tempd.c
tempd.c: In function 'main':
tempd.c:43: error: called object 'err' is not a function
tempd.c:45: error: called object 'err' is not a function
из-хза чего ругается на
called object 'err' is not a function если он уже прописан...
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-14 9:29:01
FreeBSP
не мучайся
воткни нжинХ
он выдержит
или лайтХТТПд
только xml статикой генерируй время от времени, а не динамокой на каждый запрос
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-14 9:56:01
FreeBSP
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-14 10:34:54
QweЯty
издеваетесь, да?
я первым делом в яндогугль и вписал err.h:
Код: Выделить всё
radist04ka@ cat tempd.c | grep err
#include <errno.h>
#include <err.h>
int err=-1;
err=(bind(server_sockfd, (struct sockaddr *) &server_address, server_len));
if(err!=0) printf("bind error!\n");
err=-1;
err=(listen(server_sockfd, 5));
if(err!=0) printf("listen error!\n");
err(1, "open()");
err(1, "fchdir()");
printf("read: %s. closing connection\n", strerror(errno));
ругаетяс только на это:
Код: Выделить всё
if ((f = open(".", O_RDONLY, 0)) == -1)
err(1, "open()");
if (fchdir(f) == -1)
err(1, "fchdir()");
tempd.c:43: error: called object 'err' is not a function
tempd.c:45: error: called object 'err' is not a function
остальное то в порядке...
только xml статикой генерируй время от времени, а не динамокой на каждый запрос
он у меня и был статичный..кадую минуту кроном с помощью tcl скрипта генерился
не мучайся
нифига, раз начал, теперь до конца пойду...
upd. щаз по статье попробую вторую функцию err вписать...
upd.2 не получилось
всего вот:
Код: Выделить всё
radist04ka@ cat tempd.c | grep include
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <err.h>
#include <fcntl.h>
#include <getopt.h>
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-14 10:39:43
FreeBSP
QweЯty писал(а):издеваетесь, да?
я редко стебусь и еще реже издеваюсь.
чаще - пытаюсь заставить думать
ибо если не заставить - то человек потерян для сообщества
так что попытаюсь заставить думать и тебя
QweЯty писал(а):
Код: Выделить всё
radist04ka@ cat tempd.c | grep err
int err=-1;
err(1, "open()");
прочитай, вдумайся, оцени, исправь
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-14 10:46:40
FreeBSP
QweЯty писал(а):
не мучайся
нифига, раз начал, теперь до конца пойду...
предсказываю:
ты напишешь демона
он будет работать
он завалится под парой сотен коннектов и хорошо если не завалит за собой систему
ты вернешься к идее с вебсервером, поднимешь нжинх/лайти и будешь счастлив
хотя опыт работы на сишнике это и здорово, но лучше начинать нормально или не начинать вообще
я к тому, что начинать изучать программирование на горящем проекте это не комильфо. и использовать daemon() не зная что делает fork() это не правильно
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-14 10:57:48
QweЯty
и завалится под парой сотен коннектов и хорошо если не завалит за собой систему
неееее, теперь нет:)
учел это уже...
в программке, теперь чтобы сразу все соединились в один и тот же момент это должно очень хорошо повезти.. теория вероятности рулит:)) и чего я раньше не знал о таком как random();
и потом, а что мешает, если упадет, работать по нескольким портам/сокетам... тоже нагрузка упадет
и подконец, если будет совсем лень, тупо в исходниках(или конфигах) изменить порт и запустить еще одну копию из другого каталога....я так с ботами баловался... 15 штук запустил пока они не задолбали своими "разговорчивыми" модулями..
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-14 11:01:11
QweЯty
err(1, "open()");
то есть надо открыть еще одну переменную?
вчера читал, толи про open толи про fchdir что они при нормальной работе возвращают число -1 или наоборот.
хотя другие программы наоборот работают..
щаз историю ковырял не нашел:(
Re: прослушивать порт и отвечать если пришел заданный текст
Добавлено: 2011-02-14 11:07:43
FreeBSP
переменную по другому обзови