可以使用C程序手动设置以太网而不是WiFi通信

时间:2016-10-08 17:31:29

标签: c sockets networking wifi ioctl

我编写了一个 C 程序,可以为任何可用的网络接口设置用户选择的IP地址和子网掩码。我可以通过以太网线在两台连接的计算机之间建立通信,只需使用该程序为每个计算机配置IP和网络掩码。但是,此方法不适用于WiFi接口。

以下是两台笔记本电脑通过以太网连接时所做的事情inet_config是我的 C 程序,为任何设置IP和网络掩码网络接口)。

第一台笔记本电脑:

inet_config  eth0  192.168.1.0  255.255.255.0

第二台笔记本电脑:

inet_config  eth0  192.168.1.1  255.255.255.0

这会将第一台和第二台笔记本电脑上的以太网接口的IP地址分别设置为192.168.1.0192.168.1.1。两台笔记本电脑上以太网接口的子网掩码都设置为255.255.255.0

现在,我可以使用nc在两台笔记本电脑之间建立通信。但是,如果我使用WiFi接口而不是以太网,则无法建立连接。我发现当我使用WiFi时,connect()系统调用会返回错误EHOSTUNREACH (No route to host)。任何人都可以告诉我我需要做什么才能让它在WiFi上运行?

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;
}

1 个答案:

答案 0 :(得分:0)

首先,您需要在两台计算机上将Wi-Fi卡设置为ad-hoc模式。之后您可以设置IP地址和网络掩码。