SA-MP Forums Archive
How to detect port - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: SA-MP Scripting and Plugins (https://sampforum.blast.hk/forumdisplay.php?fid=8)
+--- Forum: Scripting Help (https://sampforum.blast.hk/forumdisplay.php?fid=12)
+--- Thread: How to detect port (/showthread.php?tid=619539)



How to detect port - NeXoR - 18.10.2016

Hey guys, I am trying to make an Anti Advert, now this is my code:
PHP код:
IsValidIP(ip[])
{
    new 
num1num2num3num4;
    
sscanf(ip"p<.>iiii"num1num2num3num4);
    if(
num1 255 || num2 255 || num3 255 || num4 255) return false;
    if(
num1 || num2 || num3 || num4 0) return false;
    return 
true;

How can I detect the port ? (:XXXX)


Re: How to detect port - SickAttack - 19.10.2016

That's obviously going to fail, it isn't that simple as you could simply put characters in between and it won't detect an "IP". Detecting the port isn't necessary, however.

Here's a function I have, it could probably be improved, but it's just fine how it is (note that it's strict). Regex seems to be a lot slower either way.

PHP код:
// ** INCLUDES
#include <a_samp>
#include <sscanf>
// ** DEFINES
// *** FUNCTIONS
#define strcpy(%0,%1,%2) strcat((%0[0] = '\0', %0), %1, %2)
#define isnull(%1) ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
// ** MAIN
main()
{
    print(
"Loaded \"anti_advert.amx\".");
}
// ** CALLBACKS
public OnGameModeInit()
{    
    return 
1;
}
public 
OnGameModeExit()
{
    return 
1;
}
public 
OnPlayerText(playeridtext[])
{
    if(
IsAdvertisement(text))
    {
        
SendClientMessage(playerid0xFFFFFFFF"{FF0000}[ERROR]: {FFFFFF}Your message contains an IP Address (strict detection).");
        return 
0;
    }
    return 
1;
}
// ** FUNCTIONS
stock IsAdvertisement(text[])
{
    new 
message[128], extract[2], element[4][4], count_1count_2tempbool:number_next falsebool:next_number false;
    
strcpy(messagetextsizeof(message));
    for(new 
0strlen(message); j++)
    {
        switch(
message[i])
        {
            case 
'0'..'9':
            {
                if(
next_number)
                {
                    continue;
                }
                
number_next false;
                
strmid(extractmessage[i], 01);
                
strcat(element[count_1], extract);
                
                
count_2 ++;
                if(
count_2 == || message[1] == EOS)
                {
                    
strmid(extractmessage[1], 01);
                    if(
IsNumeric(extract))
                    {
                        
element[0][0] = EOS;
                        
element[1][0] = EOS;
                        
element[2][0] = EOS;
                        
element[3][0] = EOS;
                        
count_1 0;
                        
count_2 0;
                        
next_number true;
                        continue;
                    }
                    
temp strval(element[count_1]);
                    if(
count_1 == 0)
                    {
                        if(
temp <= 255)
                        {
                            
count_1 ++;
                            
count_2 0;
                        }
                        else
                        {
                            
element[count_1][0] = EOS;
                            
count_2 0;
                            
next_number true;
                        }
                    }
                    else
                    {
                        if(
temp <= 255)
                        {
                            
count_1 ++;
                            
count_2 0;
                        }
                        else
                        {
                            
element[0][0] = EOS;
                            
element[1][0] = EOS;
                            
element[2][0] = EOS;
                            
element[3][0] = EOS;
                            
count_1 0;
                            
count_2 0;
                            
next_number true;
                        }
                    }
                }
                if(
count_1 == 4)
                {
                    return 
1;
                }
            }
            default:
            {
                
next_number false;
                if(
number_next)
                {
                    continue;
                }
                if(!
isnull(element[count_1]))
                {
                    
temp strval(element[count_1]);
                    if(
count_1 == 0)
                    {
                        if(
temp <= 255)
                        {
                            
count_1 ++;
                            
count_2 0;
                            
number_next true;
                        }
                        else
                        {
                            
element[count_1][0] = EOS;
                            
count_2 0;
                        }
                    }
                    else
                    {
                        if(
temp <= 255)
                        {
                            
count_1 ++;
                            
count_2 0;
                            
number_next true;
                        }
                        else
                        {
                            
element[0][0] = EOS;
                            
element[1][0] = EOS;
                            
element[2][0] = EOS;
                            
element[3][0] = EOS;
                            
count_1 0;
                            
count_2 0;
                        }
                    }
                    if(
count_1 == 4)
                    {
                        return 
1;
                    }
                }
            }
        }
    }
    return 
0;
}
stock IsNumeric(const string[])
{
    return !
sscanf(string"{d}");

Regex (also strict):

PHP код:
// ** INCLUDES
#include <a_samp>
#include <regex>
// ** DEFINES
// *** FUNCTIONS
#define strcpy(%0,%1,%2) strcat((%0[0] = '\0', %0), %1, %2)
// ** MAIN
main()
{
    print(
"Loaded \"anti_advert_regex.amx\".");
}
// ** CALLBACKS
public OnGameModeInit()
{    
    return 
1;
}
public 
OnGameModeExit()
{
    return 
1;
}
public 
OnPlayerText(playeridtext[])
{
    if(
IsAdvertisement(text))
    {
        
SendClientMessage(playerid0xFFFFFFFF"{FF0000}[ERROR]: {FFFFFF}Your message contains an IP Address (strict detection).");
        return 
0;
    }
    return 
1;
}
// ** FUNCTIONS
stock IsAdvertisement(text[])
{
    new 
message[128], buildexpression[] = "(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.+){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"startend;
    
strcpy(messagetextsizeof(message));
    for(new 
0strlen(message); j++)
    {
        switch(
message[i])
        {
            case 
'0'..'9':
            {
                continue;
            }
            case 
'.':
            {
                continue;
            }
            default:
            {
                
strdel(messagei1);
                
strins(message"."i);
            }
        }
    }
    
build regex_exbuild(expression);
    
regex_exmatch(messagebuild);
    
regex_exsearch(messagebuildstartend);
    if(
start >= 0)
    {
        return 
1;
    }
    return 
0;