2016-10-08 9 views
0

Я написал программу 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; 
} 
+0

Режим подключения Wi-Fi [ad-hoc] (https://en.wikipedia.org/wiki/Wireless_ad_hoc_network) или [Точка доступа] (https://en.wikipedia.org/wiki/Wireless_access_point)? – Dmitry

+0

@Dmitry Из того, что я прочитал по ссылкам, которые вы включили, то, что я хочу настроить, является ad-hoc-сетью. Он не включает маршрутизаторы. Здесь должны быть подключены только два компьютера. Я сделал вручную, установив IP и сетевую маску для двух ноутбуков на своих беспроводных интерфейсах. Затем я сделал один из двух ноутбуков, передающих пакеты, адреса которых были IP-адресом другого компьютера. НИЧЕГО НЕ СДЕЛАЛОСЬ. Я получил сообщение об ошибке, как описано в моем сообщении. Если я делаю то же самое, но вместо этого использую проводные интерфейсы и подключаю кабель Ethernet к портам на каждом ноутбуке, работает одна и та же программа. –

ответ

0

В первом вам нужно установить карту Wi-Fi в режиме одноранговой на обоих компьютерах. После этого вы можете настроить IP-адрес и сетевую маску.

+0

Можно ли также сделать код C? –

+0

Да, посмотрите на [Беспроводные инструменты] (http://www.labs.hpe.com/personal/Jean_Tourrilhes/Linux/Tools.html) iwconfig.c. – Dmitry