Вот начало функции, над которой я работал, хотя она и не завершена, она может вызвать идеи или комментарии. Мысль, стоящая за функцией:
- Убедитесь, что переданный символьный указатель или строка является IPv4-адресом без порта с использованием его минимального / максимального размера, количества точек в строке и наличия символа двоеточия: или нет.
- Если строка не является IPv4 с портом или без него, проверьте, является ли строка IPv6, если не IPv6, то формат IP не распознается, поскольку он еще не реализован.
Я думаю, это зависит от того, насколько глубоко вы хотите углубиться в проблему, насколько глубоко вы хотите углубиться, чтобы понять, какие проблемы могут возникнуть.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <arpa/inet.h>
int isIP(char *ip)
{
char *data_ptr = ip; // Create a pointer to passed data
int orig_str_size = 0; // Create an int to hold passed data size
int str_index = 0; // Create an int to iterate individual ip characters
int dot_count = 0; // Create an int to check for the number of dots
// Count the number of characters in data_ptr
while (*data_ptr++ != '\0'){ orig_str_size++; }
if(orig_str_size <= 0) // If nothing
{
printf("Get a grip, ip is empty\n\n");
exit(0);
}
else // If within IPv4 size range
if(orig_str_size >= 7 && orig_str_size <= INET_ADDRSTRLEN)
{
char *data1_ptr = ip; // Create a pointer to passed data
printf("Within IPv4 range, %i characters in length\n\n", orig_str_size);
// Count the number of dots in the string, 3 for IPv4
for(str_index; str_index < orig_str_size; str_index++)
{
if(data1_ptr[str_index] == '.'){ dot_count++; }
}
// If theres 3 dots, while ignoring dots, check each char is a digit
if(dot_count == 3)
{
printf("There's three dots in the string\n\n");
data1_ptr = ip;
str_index = 0;
// Iterate the string char by char
for(str_index; str_index < orig_str_size; str_index++)
{
// Ignoring dots
if(data1_ptr[str_index] != '.')
{
// If isdigit() is happy its a digit and isalpha() happy not alphabetic
if(isdigit(data1_ptr[str_index]) && !isalpha(data1_ptr[str_index]))
{
printf("Digit found and is not alphabetic\n\n");
continue;
}
else
if(!isdigit(data1_ptr[str_index]) && isalpha(data1_ptr[str_index]))
{
printf("Not a recognised IPv4 address, character detected in string\n\n");
exit(0);
}
}
}
return 0;
}
}
else // If IPv6
if(orig_str_size > 0 && orig_str_size > INET_ADDRSTRLEN && orig_str_size <= INET6_ADDRSTRLEN)
{
printf("Within IPv6 range %i\n\n", orig_str_size);
return 0;
}
else
{
printf("Unknown target format, the format you provided as a target is not implemented\n\n");
exit(0);
}
}
Межсетевое взаимодействие TCP / IP
RFC791 - Интернет-протокол - https://tools.ietf.org/html/rfc791
Справочник по межсетевым технологиям CISCO http://docwiki.cisco.com/wiki/Internetworking_Technology_Handbook
Эталонная модель взаимодействия открытых систем http://docwiki.cisco.com/wiki/Internetworking_Basics#Open_Systems_Interconnection_Reference_Model
CISCO Устранение неполадок в сетях TCP / IP https://www.cisco.com/en/US/docs/internetworking/troubleshooting/guide/tr1907.pdf
Какой самый большой номер сетевого порта TCP / IP допустим для IPv4?