Я написал программу C, которая может установить IP-адрес и маску подсети по выбору пользователя для любого доступного сетевого интерфейса. Я могу установить связь между двумя компьютерами , подключенными друг к другу сетевым кабелем, просто используя эту программу для настройки IP и сетевой маски для каждого из них. Однако этот метод не работает на интерфейсе WiFi.Может вручную настроить Ethernet, но не соединение WiFi с помощью программы C
Вот что я сделал, когда два ноутбука были соединены сетевой кабель (inet_config
мой C программа, которая устанавливает IP и маску подсети для любого сетевого интерфейса).
Первый Laptop:
inet_config eth0 192.168.1.0 255.255.255.0
Второй Laptop:
inet_config eth0 192.168.1.1 255.255.255.0
Это устанавливает IP-адрес локальных сетей интерфейсов первых и вторых ноутбуки 192.168.1.0
и 192.168.1.1
соответственно. Маски подсети интерфейсов Ethernet на обоих ноутбуках установлены в 255.255.255.0
.
Теперь я могу использовать nc
для установления связи между двумя ноутбуками. Однако соединение не установлено, если я использую WiFi-интерфейсы вместо ethernet. Я обнаружил, что когда я использую WiFi, syscall connect()
возвращает ошибку EHOSTUNREACH (No route to host)
. Может ли кто-нибудь сказать мне, что мне нужно сделать, чтобы запустить этот режим на Wi-Fi?
Исходный код inet_config
здесь:
/* inet_config.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netdb.h>
#include <netinet/in.h>
#include <net/if.h>
#include <arpa/inet.h>
#define _COMMAND_NAME argv[0]
#define _INTERFACE_NAME argv[1]
#define _INET_ADDRESS argv[2]
#define _SUBNET_MASK argv[3]
int main(int argc, char ** argv)
{
int sockfd, ioctl_result, inet_conv_result, subnet_conv_result;
struct ifreq ifr;
struct sockaddr_in inet_addr, subnet_mask;
/* Check argument count */
if(argc != 4)
{
fprintf(stderr, "Usage: %s interface_name ip_addr subnet_mask\n", _COMMAND_NAME);
exit(EXIT_FAILURE);
}
/* Initialization */
bzero((char *)&ifr, sizeof(ifreq));
bzero((char *)&inet_addr, sizeof(struct sockaddr_in));
bzero((char *)&subnet_mask, sizeof(struct sockaddr_in));
strcpy(ifr.ifr_name, _INTERFACE_NAME);
/* Prepare inet_address and subnet_mask structures */
inet_addr.sin_family = AF_INET;
inet_conv_result = inet_pton(AF_INET, _INET_ADDRESS, &(inet_addr.sin_addr));
if(inet_conv_result == 0)
{
fprintf(stderr, "inet_pton: Invalid IPv4 address format\n");
exit(_EXIT_FAILURE);
}
if(inet_conv_result < 0)
{
perror("inet_pton");
exit(EXIT_FAILURE);
}
subnet_mask.sin_family = AF_INET;
subnet_conv_result = inet_pton(AF_INET, _SUBNET_MASK, &(subnet_mask.sin_addr));
if(subnet_conv_result == 0)
{
fprintf(stderr, "inet_pton: Invalid subnet mask format\n");
exit(_EXIT_FAILURE);
}
if(subnet_conv_result < 0)
{
perror("inet_pton");
exit(EXIT_FAILURE);
}
/* Open socket for network device configuration */
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0)
{
perror("socket");
exit(EXIT_FAILURE);
}
/* Call ioctl to configure network devices */
memcpy(&(ifr.ifr_addr), &inet_addr, sizeof(struct sockaddr)); // Set IP address
ioctl_result = ioctl(sockfd, SIOCSIFADDR, &ifr);
if(ioctl_result < 0)
{
perror("SIOCSIFADDR");
exit(EXIT_FAILURE);
}
memcpy(&(ifr.ifr_addr), &subnet_mask, sizeof(struct sockaddr)); //Set subnet mask
ioctl_result = ioctl(sockfd, SIOCSIFNETMASK, &ifr);
if(ioctl_result < 0)
{
perror("SIOCSIFNETMASK");
exit(EXIT_FAILURE);
}
printf("Network devices configured\n");
return 0;
}
Режим подключения Wi-Fi [ad-hoc] (https://en.wikipedia.org/wiki/Wireless_ad_hoc_network) или [Точка доступа] (https://en.wikipedia.org/wiki/Wireless_access_point)? – Dmitry
@Dmitry Из того, что я прочитал по ссылкам, которые вы включили, то, что я хочу настроить, является ad-hoc-сетью. Он не включает маршрутизаторы. Здесь должны быть подключены только два компьютера. Я сделал вручную, установив IP и сетевую маску для двух ноутбуков на своих беспроводных интерфейсах. Затем я сделал один из двух ноутбуков, передающих пакеты, адреса которых были IP-адресом другого компьютера. НИЧЕГО НЕ СДЕЛАЛОСЬ. Я получил сообщение об ошибке, как описано в моем сообщении. Если я делаю то же самое, но вместо этого использую проводные интерфейсы и подключаю кабель Ethernet к портам на каждом ноутбуке, работает одна и та же программа. –