XxMichałxX Opublikowano 4 Listopada 2009 Udostępnij Opublikowano 4 Listopada 2009 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 Więcej opcji udostępniania...
Hunter Opublikowano 4 Listopada 2009 Udostępnij Opublikowano 4 Listopada 2009 tcplisten() powinien zwrocic albo błąd albo socket. zaraz przetestuje u siebie czy to jest w ogóle możliwe. Pozatym nawet jeśli łączy to nie sądze abyś mógł przesłać coś bo do wysyłania pakietów musisz mieć id socketa z tcpaccept. Tak mi sie wydaje. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
XxMichałxX Opublikowano 4 Listopada 2009 Autor Udostępnij Opublikowano 4 Listopada 2009 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 Więcej opcji udostępniania...
Tymon Opublikowano 4 Listopada 2009 Udostępnij Opublikowano 4 Listopada 2009 Pierwszy rzut oka: nigdy nie dochodzi do momentu w którym status jest równy 2 w serwerze. EDIT NVM, nie przeczytałem o co cho. ;P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
XxMichałxX Opublikowano 4 Listopada 2009 Autor Udostępnij Opublikowano 4 Listopada 2009 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 Więcej opcji udostępniania...
XxMichałxX Opublikowano 5 Listopada 2009 Autor Udostępnij Opublikowano 5 Listopada 2009 dałem rade. po prostu tworze w serwerze socket sesji tylko wtedy, gdy status=2 i wtedy nasłuchuje, a jak zmienia sie status=1 to closesocket(socket_sesji) i gitez narq Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi