Kibor |
Отправлено: 31 Марта, 2015 - 00:39:54
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Дополнительные функции обмена данными позволяют настраивать соединение между программами Кибор или собранными EXE по схеме клиент - сервер или клиент - сервер - клиент.
Возможно соединение программ на одном компьютере, в одной посети и при наличие выделенного ip у машины на которой стоит серверная программа через интернет без промежуточного сервера.
если необходимо связаться с программой в сети интернет и нет выделенного IP необходимо использовать эти функции Обмен данными, контроль и управление другой программой по сети интернет.
Для создания сервера использовать функции
enablelistenport - включить прослушку порта
recvport - начали слушать. в отдельном потоке.
sendport - при получение сообщения в функции recvport можно ответить этой функцией
disablelistenport - отключить прослушку
синтаксис
Цитата: enablelistenport (10005);//включили прослушку 10005 порта (самому выбирать порт. должен совпадать с клиентским)
вернет больше 1 при удаче.
Цитата: char recvs[256];//массив в который принимаем
int flag_recv=0;// это флаг в котором будет 1 когда на сервер придет сообщение.
recvport (#recvs[0], 256, #flag_recv);//начали слушать. в отдельном потоке
вернет более 1 при удаче
Цитата: char sends[256];//массив который передаем
sendport (#sends[0], 256);//ответ клиенту. только если есть сообщение использовать.
вернет более 1 при удаче
Цитата: disablelistenport(); // при необходимости отключаем прослушку
узнать ip подсети можно набрав на машине сервера в пуск - выполнить - cmd /k ipconfig /all
ip надо указать в клиенте.
Нажмите для увеличения
пример программ клиент сервер
не забываем разрешать в брандмауэре
сервер
Цитата: ///////диалог
int pos_size_edit0[2][4];
string text_edit0[2];
int pos_size_static0[2][4];
string text_static0[2];
pos_size_edit0[0][0]=110; pos_size_edit0[0][1]=10; pos_size_edit0[0][2]=218; pos_size_edit0[0][3]=20;
pos_size_edit0[1][0]=177; pos_size_edit0[1][1]=52; pos_size_edit0[1][2]=152; pos_size_edit0[1][3]=20;
text_edit0[0]=""; text_edit0[1]="О сервера клиенту мегаса";
pos_size_static0[0][0]=16; pos_size_static0[0][1]=14; pos_size_static0[0][2]=80; pos_size_static0[0][3]=20;
pos_size_static0[1][0]=17; pos_size_static0[1][1]=55; pos_size_static0[1][2]=150; pos_size_static0[1][3]=20;
text_static0[0]="Сервер принял"; text_static0[1]="При приеме ответит клиенту";
createdialog(0, EDIT, #pos_size_edit0[0][0], #text_edit0[0] |
STATIC, #pos_size_static0[0][0], #text_static0[0]);
showdialog(0, "Сервер", 150, 200, 347, 117, 1, 1);
////////сам сервер
char recvs[256];//массив в который принимаем
char sends[256];//массив который передаем
int flag_recv=0;// это флаг в котором будет 1 когда на сервер придет сообщение
enablelistenport (10005);//включили прослушку 10005 порта (самому выбирать)
recvport (#recvs[0], 256, #flag_recv);//начали слушать. в отдельном потоке
enabletimer(0);//включили таймер
loop()//цикл бота
{
beep(2000, 70);
mu_pause (1000);
}
function mu_pause(int p)//реализация паузы что бы не зависал на время ее скрипт
{
for (int t=gettime(); gettime()-t<p; sleep(10)){}
}
CREATE_TIMER(0, 50)
{
if (flag_recv==1)//если тут 1 - пришло сообщение
{
flag_recv=0;//обнулим
text_edit0[0]=format(#recvs[0]);//запишем это сообщение в edit
strcpy(#sends[0], text_edit0[1]);//заполним массив передачи текстом с второго edit
sendport (#sends[0], size(#sends[0]));//отправим
recvport (#recvs[0], 256, #flag_recv); // опять слушаем
}
}
клиент. о клиенте подробнее Отправки HTML запросов. Работа в интернете...
Цитата: int pos_size_edit0[2][4];
string text_edit0[2];
int pos_size_static0[2][4];
string text_static0[2];
int pos_size_button0[1][4];
string text_button0[1];
int flag_button0[1];
pos_size_button0[0][0]=16; pos_size_button0[0][1]=91; pos_size_button0[0][2]=313; pos_size_button0[0][3]=20;
text_button0[0]="Послать на сервер";
pos_size_edit0[0][0]=115; pos_size_edit0[0][1]=10; pos_size_edit0[0][2]=213; pos_size_edit0[0][3]=20;
pos_size_edit0[1][0]=157; pos_size_edit0[1][1]=52; pos_size_edit0[1][2]=172; pos_size_edit0[1][3]=20;
text_edit0[0]=""; text_edit0[1]="От клиента серверу пошлем";
pos_size_static0[0][0]=16; pos_size_static0[0][1]=14; pos_size_static0[0][2]=95; pos_size_static0[0][3]=20;
pos_size_static0[1][0]=17; pos_size_static0[1][1]=55; pos_size_static0[1][2]=110; pos_size_static0[1][3]=20;
text_static0[0]="Получили в ответ"; text_static0[1]="Пошлем серверу";
createdialog(0, BUTTON, #pos_size_button0[0][0], #text_button0[0], #flag_button0[0] |
EDIT, #pos_size_edit0[0][0], #text_edit0[0] |
STATIC, #pos_size_static0[0][0], #text_static0[0]);
showdialog(0, "Клиент", 350, 200, 347, 152, 1, 1);
char recvs[256];//массив в который принимаем
char sends[256];//массив который передаем
enabletimer(0);//включили таймер
int n=0;
loop()//цикл бота
{
textout(0, 50, 50, format(n), 0);
n++;
mu_pause (500);
}
function mu_pause(int p)//реализация паузы что бы не зависал на время ее скрипт
{
for (int t=gettime(); gettime()-t<p; sleep(10)){}
}
CREATE_TIMER(0, 50)
{
if (flag_button0[0]>0)//если нажата кнопка
{
flag_button0[0]=0;//обнулим
/* Если на одном компьютере указать 127.0.0.1
если одна подсеть узнать ip запустив пуск выполнить cmd /k ipconfig /all
если интернеи и выделенный ip у сервака писать его ip*/
if (opensocket ("127.0.0.1", 10005)==1)//откроем сокет на 10005 порту сервера (самому выбирать)
{
strcpy(#sends[0], text_edit0[1]);//заполним массив передачи текстом с второго edit
if (sendhtml(#sends[0], size(#sends[0]))>0)//Если отправили
{
if (recvhtml(#recvs[0], 256)>0) text_edit0[0]=format(#recvs[0]);//когда примем ответ запишем ответ в edit
}
closesocket ();//Закрываем сокет
}
}
}
|
|
|
Flash |
Отправлено: 27 Февраля, 2018 - 16:14:42
|
Участник
Покинул форум
Сообщений всего: 57
Дата рег-ции: Нояб. 2015
Откуда: Лангепас
Репутация: 0
|
Всем привет ! есть проблема с сервером может кто столкнулся с этим как решить? Суть, за основу возьму 2 примера с 1-й страницы (сервер, клиент), запускаю сервер, в клиенте делаю что бы постоянно отправлял запрос на сервер то есть (flag_button0[0]=0;//обнулим) удаляю что бы было в цикле и делаю паузу (1000-10000мс неважно), делаю 2 копии клиента в .exe, запускаю клиент пошёл процесс обмена, рано или позно клиент подвисает в ожидание ответа так как (opensocket) открыт и он ждёт ответа от сервера но сервер молчит, запускаю 2-ю копию клиента тоже сразу подвисает, в сервере flag_recv==1 после каждой отправки я проверял, а количество раз обмениваются сервер клиент от 300 - до нескольких тысяч, по разному но всегда клиент виснет, проверял через cmd команду на проверку стабильности интернета всё норм потеря пакетов 0. может кто что посоветует, мне кажется что что то с сервером надо делать. может через определённое время делать disablelistenport(); чтобы клиент отвис, типо перезагрузка ). |
|
|
Flash |
Отправлено: 01 Марта, 2018 - 20:31:18
|
Участник
Покинул форум
Сообщений всего: 57
Дата рег-ции: Нояб. 2015
Откуда: Лангепас
Репутация: 0
|
Kibor пишет: Flash , код выложите.
Здравствуйте! ну вот собственно код, на примерах выше. щас проверил подвис на передаче 1100, если запустить ещё копию клиент то тоже сразу подвисает, если выключить сервер клиент отвиснет.
CODE:///////ñåðâåð
int pos_size_static0[2][4];
string text_static0[2];
int pos_size_button0[1][4];
string text_button0[1];
int flag_button0[1];
pos_size_button0[0][0]=10; pos_size_button0[0][1]=65; pos_size_button0[0][2]=120; pos_size_button0[0][3]=20;
text_button0[0]="ñòàðò";
pos_size_static0[0][0]=10; pos_size_static0[0][1]=15; pos_size_static0[0][2]=120; pos_size_static0[0][3]=20;
pos_size_static0[1][0]=10; pos_size_static0[1][1]=40; pos_size_static0[1][2]=120; pos_size_static0[1][3]=20;
text_static0[0]="êîëè÷åñòâî çàïðîñîâ"; text_static0[1]="";
createdialog(0, BUTTON, #pos_size_button0[0][0], #text_button0[0], #flag_button0[0] |
STATIC, #pos_size_static0[0][0], #text_static0[0]);
showdialog(0, "ñåðâåð", 350, 200, 147, 125, 1, 1);
char recvs[256];
char sends[256];
int flag_recv=0;
loop()
{
if(flag_button0[0]>0)goto 1;
sleep(30);
}
1:;
flag_button0[0]=0;
enablelistenport (10005);
recvport (#recvs[0], 256, #flag_recv);
enabletimer(0);
loop()
{
//beep(2000, 70);
mu_pause (1000);
}
function mu_pause(int p)
{
for (int t=gettime(); gettime()-t<p; sleep(10)){}
}
CREATE_TIMER(0, 50)
{
if (flag_recv==1)
{
flag_recv=0;
text_static0[1]=format(#recvs[0]);
strcpy(#sends[0], text_static0[1]);
sendport (#sends[0], size(#sends[0]));
recvport (#recvs[0], 256, #flag_recv);
}
}
CODE:///////êëèåíò
int pos_size_static0[2][4];
string text_static0[2];
int pos_size_button0[1][4];
string text_button0[1];
int flag_button0[1];
pos_size_button0[0][0]=10; pos_size_button0[0][1]=65; pos_size_button0[0][2]=120; pos_size_button0[0][3]=20;
text_button0[0]="ñòàðò";
pos_size_static0[0][0]=10; pos_size_static0[0][1]=15; pos_size_static0[0][2]=120; pos_size_static0[0][3]=20;
pos_size_static0[1][0]=10; pos_size_static0[1][1]=40; pos_size_static0[1][2]=120; pos_size_static0[1][3]=20;
text_static0[0]="êîëè÷åñòâî îòâåòîâ"; text_static0[1]="";
createdialog(0, BUTTON, #pos_size_button0[0][0], #text_button0[0], #flag_button0[0] |
STATIC, #pos_size_static0[0][0], #text_static0[0]);
showdialog(0, "êëèåíò", 350, 200, 147, 125, 1, 1);
char recvs[256];
char sends[256];
int k=0; ///// Ñ÷¸ò÷èê
string K;
enabletimer(0);
int n=0;
loop()
{
mu_pause (500);
}
function mu_pause(int p)
{
for (int t=gettime(); gettime()-t<p; sleep(10)){}
}
CREATE_TIMER(0, 50)
{
if (flag_button0[0]>0)
{
//flag_button0[0]=0;
if (opensocket ("127.0.0.1", 10005)==1)
{
k++;
K=format(k);
strcpy(#sends[0], K);
if (sendhtml(#sends[0], size(#sends[0]))>0)
{
if (recvhtml(#recvs[0], 256)>0) text_static0[1]=format(#recvs[0]);
}
closesocket ();
}
}
pause(1000);
} |
|
|
Kibor |
Отправлено: 01 Марта, 2018 - 21:07:05
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
сервер
CODE:///////диалог
int pos_size_edit0[2][4];
string text_edit0[2];
int pos_size_static0[2][4];
string text_static0[2];
pos_size_edit0[0][0]=110; pos_size_edit0[0][1]=10; pos_size_edit0[0][2]=218; pos_size_edit0[0][3]=20;
pos_size_edit0[1][0]=177; pos_size_edit0[1][1]=52; pos_size_edit0[1][2]=152; pos_size_edit0[1][3]=20;
text_edit0[0]=""; text_edit0[1]="О сервера клиенту мегаса";
pos_size_static0[0][0]=16; pos_size_static0[0][1]=14; pos_size_static0[0][2]=80; pos_size_static0[0][3]=20;
pos_size_static0[1][0]=17; pos_size_static0[1][1]=55; pos_size_static0[1][2]=150; pos_size_static0[1][3]=20;
text_static0[0]="Сервер принял"; text_static0[1]="При приеме ответит клиенту";
createdialog(0, EDIT, #pos_size_edit0[0][0], #text_edit0[0] |
STATIC, #pos_size_static0[0][0], #text_static0[0]);
showdialog(0, "Сервер", 150, 200, 347, 117, 1, 1);
////////сам сервер
char recvs[256];//массив в который принимаем
char sends[256];//массив который передаем
int flag_recv=0;// это флаг в котором будет 1 когда на сервер придет сообщение
enablelistenport (10005);//включили прослушку 10005 порта (самому выбирать)
recvport (#recvs[0], 256, #flag_recv);//начали слушать. в отдельном потоке
enabletimer(0);//включили таймер
loop()//цикл бота
{
beep(2000, 70);
mu_pause (1000);
}
function mu_pause(int p)//реализация паузы что бы не зависал на время ее скрипт
{
for (int t=gettime(); gettime()-t<p; sleep(10)){}
}
CREATE_TIMER(0, 50)
{
if (flag_recv==1)//если тут 1 - пришло сообщение
{
flag_recv=0;//обнулим
text_edit0[0]=format(#recvs[0]);//запишем это сообщение в edit
strcpy(#sends[0], text_edit0[1]);//заполним массив передачи текстом с второго edit
sendport (#sends[0], size(#sends[0]));//отправим
recvport (#recvs[0], 256, #flag_recv); // опять слушаем
}
}
клиент
CODE:int pos_size_edit0[1][4];
string text_edit0[1];
int pos_size_static0[2][4];
string text_static0[2];
int pos_size_button0[1][4];
string text_button0[1];
int flag_button0[1];
pos_size_button0[0][0]=16; pos_size_button0[0][1]=91; pos_size_button0[0][2]=313; pos_size_button0[0][3]=20;
text_button0[0]="Послать на сервер значение переменной k";
pos_size_edit0[0][0]=115; pos_size_edit0[0][1]=10; pos_size_edit0[0][2]=213; pos_size_edit0[0][3]=20;
text_edit0[0]="";
pos_size_static0[0][0]=16; pos_size_static0[0][1]=14; pos_size_static0[0][2]=95; pos_size_static0[0][3]=20;
pos_size_static0[1][0]=17; pos_size_static0[1][1]=55; pos_size_static0[1][2]=170; pos_size_static0[1][3]=20;
text_static0[0]="Получили в ответ"; text_static0[1]="Пошлем серверу переменную k";
createdialog(0, BUTTON, #pos_size_button0[0][0], #text_button0[0], #flag_button0[0] |
EDIT, #pos_size_edit0[0][0], #text_edit0[0] |
STATIC, #pos_size_static0[0][0], #text_static0[0]);
showdialog(0, "Клиент", 350, 200, 347, 152, 1, 1);
int k=0;
char recvs[256];//массив в который принимаем
char sends[256];//массив который передаем
enabletimer(0);//включили таймер
int n=0;
loop()//цикл бота
{
textout(0, 50, 50, format(n), 0);
n++;
mu_pause (500);
}
function mu_pause(int p)//реализация паузы что бы не зависал на время ее скрипт
{
for (int t=gettime(); gettime()-t<p; sleep(10)){}
}
CREATE_TIMER(0, 50)
{
//if (flag_button0[0]>0)//ЗАКОМЕНТИРОВАЛИ
{
flag_button0[0]=0;//обнулим
/* Если на одном компьютере указать 127.0.0.1
если одна подсеть узнать ip запустив пуск выполнить cmd /k ipconfig /all
если интернеи и выделенный ip у сервака писать его ip*/
if (opensocket ("127.0.0.1", 10005)==1)//откроем сокет на 10005 порту сервера (самому выбирать)
{
k++;
if (k>9999999)k=0;
strcpy(#sends[0], format(k));//заполним массив передачи текстом с второго edit
if (sendhtml(#sends[0], size(#sends[0]))>0)//Если отправили
{
if (recvhtml(#recvs[0], 256)>0) text_edit0[0]=format(#recvs[0]);//когда примем ответ запишем ответ в edit
}
closesocket ();//Закрываем сокет
}
}
}
комментировал кнопку.
//if (flag_button0[0]>0)//ЗАКОМЕНТИРОВАЛИ
в цикле шлется переменная k
все нормально.
можно поменять при работе текст что сервер возвратит. |
|
|
|