Используя Сокеты в Xcode Cpp - PullRequest
0 голосов
/ 19 апреля 2020

Я делаю программу для сокетов в среде MacOS, используя Xcode 11.3.1. В настоящее время я делаю проект мой проект с шаблоном Project - MacOs - Command Line Tool на языке C ++. Однако, когда я принимаю 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;
}

Это мой основной класс для моего кода. Это просто базовая c привязка порта, последовательность прослушивания и приема. Я подтвердил, что этот код работает, когда он скомпилирован G ++ на терминале. Я проверил с моим простым Python кодом. Однако, когда я отлаживаю с моим Xcode (та кнопка Play слева вверху), я не могу подключиться к этой программе с помощью сокета. Кажется, что XCode блокирует сетевые подключения при запуске этого кода.

Для вашей информации, скрипт Python, который я использовал для подключения к моей программе на C ++, был примерно таким.

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

В настоящее время я тестирую на той же машине с внутренней сетью, что означает, что все соединения будут go до 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 не получил никакой передачи по этому порту.

В настоящее время я искал много путей по всему rnet, включая переполнение стека. Я попытался добавить «Возможности» в настройках XCode и включил сетевой сервер и клиент. Это не помогло и привело к другой проблеме с Xcode. Я пробовал другие методы, такие как отладка XCode с разрешениями root, но это не сработало. Кроме того, для вашей информации, мой порт 37716 является пустым портом, и ни один процесс не использует его сейчас.

1 Ответ

0 голосов
/ 19 апреля 2020

Я пробовал более 100 методов за последние 5 часов только на этом. И обнаружил, что это работает таким образом. Были некоторые проблемы с этим кодом.

Первая проблема заключалась в том, что я не включил #include <CoreFoundation/CoreFoundation.h> этот заголовочный файл. Вторая проблема была связана с неправильной последовательностью включения заголовочных файлов или библиотеки. Я использовал другую библиотеку .framework под названием CUESDK.framework. Если я загружаю эту библиотеку раньше, чем загружаю этот код, она вылетает. Странно, почему это происходит.

Я не уверен на 100%, решено ли это или нет. Но я просто опубликую свой код ниже, если он может кому-нибудь помочь!

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