📜  wsl 开放端口到 windows - C 编程语言(1)

📅  最后修改于: 2023-12-03 15:21:16.346000             🧑  作者: Mango

WSL 开放端口到 Windows - C 编程语言

在 Windows 10 上运行的 WSL(Windows Subsystem for Linux)提供了一个真正的 Linux 内核,使得开发者能够在 Windows 上运行常见的 Linux 工具和应用程序。当你在 WSL 中运行应用程序时,它们将运行在一个虚拟的 Linux 环境中,而不是直接访问 Windows 上的硬件。

在使用 WSL 进行开发时,有时需要将 WSL 中的应用程序的端口暴露给 Windows。这通常发生在需要通过浏览器或其他应用程序访问运行在 WSL 中的 Web 应用程序时。下面是在 C 编程语言中开放 WSL 端口的一些方法。

1. 使用 Sockets API

使用 Sockets API 是在 C 编程语言中开放端口最常见的方法之一。下面是一个使用 Sockets API 的示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define PORT 8080
#define MAX_BUF_SIZE 1024

int main() {
    int server_fd, new_socket, valread;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[MAX_BUF_SIZE] = {0};
    char* hello = "Hello from WSL!";

    // 创建套接字
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // 开放端口
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);

    // 绑定套接字到端口
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    // 监听套接字
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    // 接受来自客户端的请求
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }

    // 从客户端接收数据
    valread = read(new_socket, buffer, MAX_BUF_SIZE);
    printf("%s\n", buffer);

    // 向客户端发送数据
    send(new_socket, hello, strlen(hello), 0);
    printf("Hello message sent\n");
    return 0;
}

这是一个简单的 C 语言代码,它开放了 WSL 中的 8080 端口,并向连接到该端口的客户端发送“Hello from WSL!”消息。

2. 使用 iptables

另一个在 WSL 中开放端口的方法是使用 iptables 命令。以下是在 C 语言中使用 system 函数运行 iptables 命令的示例:

#include <stdio.h>
#include <stdlib.h>

int main() {
    char command[] = "sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT";
    system(command);
    return 0;
}

这个例子使用 iptables 命令开放 WSL 中的 8080 端口。

总结

WSL 提供了一个强大的工具,使得在 Windows 平台上进行 Linux 开发变得更加容易。在 C 语言中开放 WSL 端口的两种方法中,使用 Sockets API 是最常用的方法,但如果需要更大的灵活性, iptables 命令也是一个不错的选择。