在 Xcode Cpp 中使用套接字

Using Sockets in Xcode Cpp

我正在使用 Xcode 11.3.1 在 MacOS 环境中制作套接字程序。我目前正在使用 C++ 语言的模板 Project - MacOs - Command Line Tool 将项目设为我的项目。但是,我在接受 Socket 时遇到了一些问题。

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

#define PORT 37716

class Communications{
public:
    int server_fd, new_socket, valread;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};

Communications(){
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt));

    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons( PORT );

    bind(server_fd, (struct sockaddr *)&address, sizeof(address));
    listen(server_fd, 3);
    cout << "[Server] Listening in port " << PORT << endl;

    new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);
    cout << "[Server] Client has successfully connected." << endl;
    }
};

int main(void){
    Communications CommunicationsObj = Communications();
    return 0;
}

这是我的代码的主要 class。它只是一个基本的端口绑定、监听和接受序列。我已经确认这段代码在终端上由 G++ 编译时可以正常工作。我已经用我的简单 Python 代码进行了测试。但是,当我使用 Xcode(左上角的播放按钮)进行调试时,我无法使用套接字连接到该程序。似乎 Xcode 在 运行 这段代码时阻止了网络连接。

供您参考,我用来连接到我的 C++ 程序的 Python 脚本是这样的。

from socket import *
port = 37716
ClientSock = socket(AF_INET, SOCK_STREAM)
ClientSock.connect(('', port))

我目前正在同一台具有内部网络的机器上进行测试,这意味着所有连接都将转到 127.0.0.1

当我在终端环境中使用 G++ 和 运行 进行编译时,一切顺利。但是在 Xcode 上调试时,会出现这些错误。

Traceback (most recent call last):
File "a.py", line 7, in <module>
client_sock.connect(('',port))
ConnectionRefusedError: [Errno 61] Connection refused

在程序的C++端,画面像

[Server] Listening in port 37716

这永远。这意味着 Xcode 在该端口上没有收到任何 t运行 任务。

我目前在整个互联网上寻找了很多方法,包括 Stack Overflow。我尝试在 Xcode 设置中添加 "Capabilities" 并启用网络服务器和客户端。这没有帮助并导致 Xcode 出现另一个问题。我尝试了其他方法,例如使用 root 权限调试 Xcode,但没有用。另外,供您参考,我的端口 37716 是一个空端口,目前没有进程正在使用它。

在过去的 5 个小时里,仅此一项我就尝试了 100 多种方法。并发现它是这样工作的。此代码存在一些问题。

第一个问题是我没有包含 #include <CoreFoundation/CoreFoundation.h> 这个头文件。 第二个问题是由于包含头文件或库的顺序错误。 我正在使用另一个名为 CUESDK.framework 的 .framework 库。如果我在加载此代码之前加载该库,它就会崩溃。它发生的原因有点奇怪。

我不是100%确定它是否解决了。但如果它可以帮助任何人,我会 post 下面我的代码!

#include <CoreFoundation/CoreFoundation.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <iostream>

#define PORT 37716
#include <stdio.h>

class ConnectrionBridge{
public:
    int servsock;
    int enable;
    int port;

ConnectrionBridge(void){
        servsock = socket(AF_INET, SOCK_STREAM, 0);
        if(servsock < 0) perror("Failed to create a socket");

        enable = 1;
        setsockopt(servsock, SOL_SOCKET, SO_REUSEADDR, (char*)&enable, sizeof(int));

        //Bind to "any" address with a specific port to listen on that port
        sockaddr_in serv_addr;
        memset(&serv_addr, 0, sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = INADDR_ANY;
        serv_addr.sin_port = htons(PORT);

        bind(servsock, (sockaddr*)&serv_addr, sizeof(serv_addr));

        listen(servsock, 5);
        std::cout<< "Listening Server on port " << PORT << std::endl;


        //Accept a client
        struct sockaddr_storage client_addr_info;
        socklen_t len = sizeof client_addr_info;


        int clientsock = accept(servsock, (struct sockaddr*)&client_addr_info, &len);

        std::cout << "connected" << std::endl;
}
};

我遇到了同样的问题,我刚刚解决了!

出于某些疯狂的原因,当您输入:

using namespace std;

套接字连接在 MacOS 上不起作用。您需要在每个需要它的 method/class 之前手动放置 std::

[例如:std::coutstd::endlstd::string]