Skocz do zawartości

Zablokowane Samo tcplisten a juz podlacza


XxMichałxX

Rekomendowane odpowiedzi

Mam serwer i klient.

I jest taka sytuacja, że serwer ma stworzony socket (tcplisten) ale nie nasłuchuje (nie ma tcpaccept), pomimo to klient podłącza się do serwera. Czemu tak jest? I jak temu zapobiec? Może ten tryb blokowania czy cos? :sp_ike:

 

edit: a moze cos ja zawaliłem? bo nie pamietam za bardzo w jakich przypadkach co zwraca tcplisten() jak ktos wie to niech poda

Odnośnik do komentarza
Udostępnij na innych stronach

nie no wszystko przejrzałem, sprawdzałem nawet na wsadzaniu show_message no i poprostu klient się podłącza bez tcpaccept u serwera, bynajmiej na to wygląda, bo serwer nie pokazuje ze sie podłączył klient, tylko dopiero jak sie kliknie zeby włączył tcpaccept to po jednym stepie odrazu sie wlacza ze klient sie podłączył. kodu wam nie pokaze bo jest bardzo dlugi, ale sproboje to skrócić:

 

[serwer]

Create:

GML
socket=tcplisten(12345,5,1);

status=1;

// status: 1 - nie nasluchuje 2 - nasluchuje 3 - polaczony</span></span>

Step:

GML
switch(status)

{

case 2:

new=tcpaccept(socket,1);

if new status=3;

break;

case 3:

//tutaj odbieranie wiadomosci, wysylanie itd bo juz tu jest połączony

break;

}

Draw:

GML
draw_text(0,0,'Status: ') //i tutaj tak zrobione ze ma status pokazywac 1. Wstrzymany, 2. Oczekiwanie 3. Połączony</span></span>

 

 

[Klient]

Create:

GML
status=1; // 1 - rozłączony, 2 -połaczony

server=tcpconnect('127.0.0.1',12345,1);

if server<=0 show_message('Dupa');

else status=2;

Draw:

GML
draw_text(0,0,'Status: ') //i tu tez zrobione ze ma pisac albo Połączony albo Rozłączony w zależności od zmiennej status</span></span>

 

No i teraz sytuacja taka że w serwerze status=1 i włączam klienta i w kliencie mi pisze ze połączony chociaz nie ma prawa się połączyć/nie jest połączony

 

 

edit: dobra dodam jeszcze to co dotychczas zrobiłem i sobie zobaczcie:

 

https://gmclan.org/up5208_4_GitRC_Problem.html

 

aby cos zrobic to lewy przycisk myszy na panelu ze statusem kliknac i macie tam wyskoczy show_menu

Odnośnik do komentarza
Udostępnij na innych stronach

lol nie chodzi o to. w oryginalnym kodzie dochodzi do takiego momentu.

masz tu oryginalny kod:

 

[serwer]

Client:

GML
new=-1;

SST_Create(working_directory+"\SST.dll",0);

parent_handle = SST_SetHandles(window_handle());

SST_LoadIcon(working_directory+"\GitRC_Server.ico");

SST_SetToolTip("GitRC - Server");

SST_WindowProcedure(1);

SST_Notify(sst.NIM_ADD);

dllinit(0,1,0);

socket=tcplisten(12345,2,1);

rec=0;

cip='';

registry_set_root('HKEY_LOCAL_MACHINE');

port=12345;

fun=0;

ini_open('config.ini');

stat=round(ini_read_real('MAIN','stat',2));

hmf=14;

for(i=1; i<=hmf; i+=1)

{

fun[i,1]=round(ini_read_real('MAIN','fun'+string(i),0));

fun[i,2]=string(i);

}

fun[1,2]='Pokaż wiadomość';

fun[2,2]='Zadaj pytanie';

fun[3,2]='Otwórz CD';

fun[4,2]='Zamknij CD';

fun[5,2]='Sprawdź plik';

fun[6,2]='Usuń plik';

fun[7,2]='Stwórz plik';

fun[8,2]='Sprawdź ścieżkę';

fun[9,2]='Usuń ścieżkę';

fun[10,2]='Stwórz ścieżkę';

fun[11,2]='Zrestartuj serwer';

fun[12,2]='Wyłącz serwer';

fun[13,2]='Zrestartuj komputer';

fun[14,2]='Wyłącz komputer';

lag=0;

ini_close();

 

Step:

GML
switch(SST_GetInput())

{

case sst.WM_LBUTTONUP:

if (SST_IsIconic())

{

SST_ShowWindow(parent_handle,sst.SW_SHOW);

SST_ShowWindow(parent_handle,sst.SW_RESTORE);

SST_SetForegroundWindow(window_handle());

}

else

{

SST_ShowWindow(parent_handle,sst.SW_MINIMIZE);

SST_ShowWindow(parent_handle,sst.SW_HIDE);

}

break;

}

switch(stat)

{

case 2:

new=tcpaccept(socket,1);

if new stat=3;

cip=lastinIP();

case 3:

{

rec=receivemessage(new);

if rec>0

{

var nag;

nag=readbyte();

}

else if rec=0

{

closesocket(new);

stat=2;

exit;

}

else

{

exit;

}

switch(nag)

{

case 16:

send_funs();

break;

case 1:

if fun[1,1]=1

{

show_message(readstring());

}

else

{

send_msg('Ta funkcja zostala zablokowana przez serwer!');

send_funs();

}

break;

case 2:

if fun[2,1]=1

{

var _odp;

_odp=get_string(readstring(),0);

send_msg('Odpowiedź: '+string(_odp));

}

else

{

send_msg('Ta funkcja zostala zablokowana przez serwer!');

send_funs();

}

break;

}

}

break;

}

if mouse_check_button_released(mb_left)

{

if mouse_x>=20 && mouse_y>=20 && mouse_x<=250 && mouse_y<=120

{

if stat=1

{

if show_menu('Wznów|Anuluj',1)=0 stat=2;

}

else if show_menu('Wstrzymaj|Anuluj',1)=0

{

if stat=3

{

if show_message_ext('Napewno chcesz przerwac polaczenie?','Tak',0,'Nie')=1

{

stat=1;

closesocket(new);

}

}

else

{

stat=1;

}

}

ini_open('config.ini');

ini_write_real('MAIN','stat',stat);

ini_close();

}

else if mouse_x>=380 && mouse_x<=room_width-20 && mouse_y>=20 && mouse_y<=room_height-20

{

for(i=1; i<=hmf; i+=1)

{

var _x1,_y1,_x2,_y2;

_x1=390;

_y1=30+(i-1)*20;

_x2=room_width-30;

_y2=_y1+20;

if mouse_x>=_x1 && mouse_x<=_x2 && mouse_y>=_y1 && mouse_y<=_y2

{

if fun[i,1]=1 fun[i,1]=0 else fun[i,1]=1;

ini_open('config.ini');

ini_write_real('MAIN','fun'+string(i),fun[i,1]);

ini_close();

if stat=3

{

clearbuffer();

writebyte(1);

writebyte(i);

writebyte(fun[i,1]);

sendmessage(new);

}

}

}

}

}

 

Draw:

GML
draw_set_color(c_blue);

draw_set_font(main_font);

draw_rectangle(20,20,250,120,0);

draw_set_color(c_white);

switch(stat)

{

case 1:

draw_text(30,30,'Status: Wstrzymany');

draw_sprite(stat1,-1,210,80);

break;

case 2:

draw_text(30,30,'Status: Oczekiwanie');

draw_sprite(stat2,-1,210,80);

break;

case 3:

draw_text(30,30,'Status: Połączony');

draw_text(30,50,'IP: '+cip);

draw_sprite(stat3,-1,210,80);

break;

}

 

 

draw_set_color(c_blue);

draw_rectangle(380,20,room_width-20,room_height-20,0);

draw_set_color(c_white);

for(i=1; i<=hmf; i+=1)

{

draw_text(390,30+(i-1)*20,fun[i,2]);

if fun[i,1]=1 draw_sprite(tru,-1,room_width-50,30+(i-1)*20);

else draw_sprite(fal,-1,room_width-50,30+(i-1)*20);

}

 

 

[Client]

Create:

GML
dllinit(0,1,0);

serv=0;

stat=1;

ip='127.0.0.1';

port=12345;

fun=0;

hmf=14;

for(i=1; i<=hmf; i+=1)

{

fun[i,1]=0;

}

fun[1,2]='Pokaż wiadomość';

fun[2,2]='Zadaj pytanie';

fun[3,2]='Otwórz CD';

fun[4,2]='Zamknij CD';

fun[5,2]='Sprawdź plik';

fun[6,2]='Usuń plik';

fun[7,2]='Stwórz plik';

fun[8,2]='Sprawdź ścieżkę';

fun[9,2]='Usuń ścieżkę';

fun[10,2]='Stwórz ścieżkę';

fun[11,2]='Zrestartuj serwer';

fun[12,2]='Wyłącz serwer';

fun[13,2]='Zrestartuj komputer';

fun[14,2]='Wyłącz komputer';

SST_Create(working_directory+"\SST.dll",0);

parent_handle = SST_SetHandles(window_handle());

SST_LoadIcon(working_directory+"\GitRC_Client.ico");

SST_SetToolTip("GitRC - Client");

SST_WindowProcedure(1);

SST_Notify(sst.NIM_ADD);

 

Step:

GML
switch(SST_GetInput())

{

case sst.WM_LBUTTONUP:

if (SST_IsIconic())

{

SST_ShowWindow(parent_handle,sst.SW_SHOW);

SST_ShowWindow(parent_handle,sst.SW_RESTORE);

SST_SetForegroundWindow(window_handle());

}

else

{

SST_ShowWindow(parent_handle,sst.SW_MINIMIZE);

SST_ShowWindow(parent_handle,sst.SW_HIDE);

}

break;

}

if mouse_check_button_released(mb_left)

{

if mouse_x>=30 && mouse_x<=250 && mouse_y>=30 && mouse_y<=120

{

if stat=1

{

switch(show_menu('Połącz|Ustaw ip|Ustaw port|Anuluj',3))

{

case 0:

serv=tcpconnect(ip,port,1);

if serv<=0 show_message('Nie moge sie polaczyc z serwerem o ip '+ip+' i porcie '+string(port)+'!');

else stat=2;

break;

case 1:

ip=get_string('Podaj ip:',0);

break;

case 2:

port=get_integer('Podaj port:',0);

break;

}

}

else

{

switch(show_menu('Rozłącz|Ustaw ip|Ustaw port|Anuluj',3))

{

case 0:

if show_message_ext('Czy napewno chcesz sie rozlaczyc?','Tak',0,'Nie')=1

{

closesocket(serv);

stat=1;

}

else if serv stat=2;

break;

case 1:

ip=get_string('Podaj ip:',0);

break;

case 2:

port=get_integer('Podaj port:',0);

break;

default:

clearbuffer();

writebyte(1);

writestring('Siemaq!');

sendmessage(serv);

break;

}

}

}

}

if stat=2

{

var rec,nag;

rec=receivemessage(serv);

if rec>0

{

nag=readbyte();

}

else if rec=0

{

closesocket(serv);

stat=1;

exit;

}

else

{

exit;

}

switch(nag)

{

 

}

}

 

Draw:

GML
draw_set_color(c_green);

draw_set_font(main_font);

draw_rectangle(20,20,250,120,0);

draw_set_color(c_white);

switch(stat)

{

case 1:

draw_text(30,30,'Status: Rozłączony');

draw_sprite(stat1,-1,210,80);

break;

case 2:

draw_text(30,30,'Status: Połączony');

draw_sprite(stat2,-1,210,80);

break;

}

draw_text(30,50,'IP: '+string(ip));

draw_text(30,70,'Port: '+string(port));

 

 

 

I tak z tego syfu nic nie wywnioskujecie, ale powiem tak: wzorujcie sie na tym skróconym kodzie, z tym ze pomincie to ze nigdy nie dochodzi do momentu status=2, bo dochodzi ale w oryginalnym kodzie

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...