使用 C 将 Linux 客户端连接到 MacOS 服务器

标签 c sockets

我研究套接字并尝试编写一个非常简单的应用程序。客户端发送字符串“Hello There!”,服务器接受它,显示在自身上并发送回来。编写客户端(Linux Ubuntu 18.04)和服务器(macOS 10.14.2,IP:217.144.173.149): 服务器:

int main()
{
    int sock, listener;
    struct sockaddr_in addr;
    char buf[1024];
    int bytes_read;

    listener = socket(AF_INET, SOCK_STREAM, 0);
    if(listener < 0)
    {
        perror("socket");
        exit(1);
    }

    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("bind");
        exit(2);
    }

    listen(listener, 1);

    while(1)
    {
        sock = accept(listener, 0, 0);
        if(sock < 0)
        {
            perror("accept");
            exit(3);
        }

        while(1)
        {
            bytes_read = recv(sock, buf, 1024, 0);
            if (bytes_read <= 0) break;
            printf(buf);
            send(sock, buf, bytes_read, 0);
        }

        close(sock);
    }

    return 0;
}

客户:

int main()
{
    char message[] = "Hello there!\n";
    char buf[sizeof(message)];

    int sock;
    struct sockaddr_in addr;

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0)
    {
        perror("socket");
        exit(1);
    }

    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = inet_addr("217.144.173.149");
    if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("connect");
        exit(2);
    }

    send(sock, message, sizeof(message), 0);
    recv(sock, buf, sizeof(message), 0);

    printf(buf);
    close(sock);

    return 0;
}

但是,启动客户端后,它只是挂起,并在一段时间后给出错误:connect: Connection timed out。当然,服务器同时也可以工作。谷歌搜索没有给出结果(也许我正在寻找)。我做错了什么?

最佳答案

问题在于您将 IP 地址从表示类型转换为网络类型的方式。

  1. 如果 IP 地址是静态的,您应该使用它,而不是使用 INADDR_ANY
  2. 如果问题仍然存在,请尝试使用不同的函数来转换 IP。

如需进一步引用,请访问 here .

关于使用 C 将 Linux 客户端连接到 MacOS 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53920575/

相关文章:

c - 使用带有按钮的 CCS 切换 LED

c - 我的程序有时会返回 true,但并不总是 Codewars 问题 "Are they same"

c - UDP 客户端/服务器 c

c - 函数修改外部变量

c - 将 Fork 用于命令行参数

java - 永久使用 Socket 来处理 ClientSession 或为每个请求创建一个新的 ClientSession

java - 即时屏幕捕获 Java

c - Socket编程中listen()的作用是什么?

C - 数独求解器 - 帮助理解函数

javascript - 即使客户端没有提供回调,有没有办法从服务器发送响应?