TCP-сервер RPi C ++ с TCP-клиентом Unity C#: как выполнить отладку? - PullRequest
0 голосов
/ 17 марта 2020

Проще говоря, я запускаю основную c программу сервера TCP через wlan0 на моем RPi 3b и пытаюсь подключиться к нему с помощью клиента TCP, который я создал в Unity (5.6), в настоящее время работающего на Win7 64-битная широта Dell. Я создал соединение Wi-Fi через точку доступа на RPi с помощью Network Manager GUI, и я могу видеть и пинговать соединение с моего ноутбука (но, читая по сторонам, я понимаю, что это мало что значит). Так как я уверен, что кто-то спросит, вот вывод из iw dev wlan0 info:

Interface wlan0
   ifindex 3
   wdev 0x1
   addr <mac address>
   ssid mySSID
   type AP
   wiphy 0
   channel 1 (2412MHz) width: 20MHz center1: 2412MHz

... и ifconfig wlan0:

wlan0 Link encap: Ethernet HWaddr <mac address>
      inet addr:10.42.0.1 Bcast:10.42.0.255 Mask:255.255.255.0
      inet6 addr: fe80::ba27:ebff:fe95:d9b5/64 Scope:link
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
      RX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000
      RX bytes:0 (0.0B) TX bytes:8245 (8.2KB)

... так как я могу в хотя бы ping, я (возможно, неправильно?) предполагаю, что соединение с Wi-Fi - не проблема, а настройки сокета или брандмауэра Это есть в выводе iptables -L -n:

...
Chain FORWARD (policy ACCEPT)
target    plot opt source          destination
ACCEPT    all  --  0.0.0.0/0       10.42.0.0/24       state RELATED,ESTA
BLISHED
ACCEPT    all  --  10.42.0.0/24    0.0.0.0/0
...

..., который я собираю, означает, что соединение разрешено, когда «маршрутизируется» через систему. Нужно ли добавлять правила в цепочки INPUT и OUTPUT, или это стандарт? На моем ноутбуке Unity включен как исключение брандмауэра. Если есть другие способы, которыми брандмауэр может блокировать меня, то они могут быть хорошим способом отладки (?).

Код сервера / клиента приведен ниже: tcp.h (сторона сервера C ++)

//various includes
namespace tcp {

class tcpServer {
    int fd_sock, fd_conn;
    static const int port = 50001;
    struct sockaddr_in sock;

    public:
    void Connect() {
        fd_sock = socket(AF_INET, SOCK_STREAM,0);
        if(fd_sock < 0) 
            std::cout << "Socket Error!" << "\n";
        sock.sin_family = AF_INET;
        inet_pton(AF_INET,"10.42.0.1",&(sock.sin_addr)); //certainly create socket on 10.42.0.1
        sock.sin_port = htons(port);

        if(bind(fd_sock,(struct sockaddr *)&sock, sizeof(sock)) < 0)
            std::cout << "Binding Error!" << "\n";
        else std::cout << "I've created a TCP socket..." << "\n";

        if(listen(fd_sock, 3) < 0)
            std::cout << "Error Listening!" << "\n";
        else std::cout << "I'm listening for a connection..." << "\n";

        struct sockaddr_in client = {0};
        socklen_t clen = sizeof(client);
        if(accept(fd_sock, (struct sockaddr *)&client, (socklen_t *)&clen) < 0)
            std::cout << "Error Accepting!" << "\n";
        else std::cout << "Connection Accepted!" << "\n";
        }
    };
}

main. cpp

//various includes
using namespace tcp;

int main () {
    // unassociated initialisations
    tcpServer srv;
    srv.Connect();

    while(true) {
    // other code
    }
}

... и вывод:

Я создал сокет TCP ... Я слушаю соединение ...

т.е. нет ответа от функции accept (), он просто продолжает ждать.

TcpRobotClient.cs (C# на стороне клиента) Примечание: я взял обработка исключений для удобства просмотра, пожалуйста, не переводите это в обсуждение обработки ошибок, спасибо!

public class TcpRobotClient : MonoBehaviour {
    public string IP = "10.42.0.1"; //
    public Int32 port = 50001;
    public Text status;
    private TcpClient socket;
    private NetworkStream stream;

    void Start () {
            socket = new TcpClient(IP,port);
            status.text = "...";
            stream = socket.GetStream ();
            status.text = "connected";
    }

... и исключение говорит SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond., что для меня звучит как ошибка тайм-аута .

Используя WireShark, я вижу, что клиент отправляет что-то на порт 50001 (запрос называется?), Но RPi не отвечает. Я выполнил поиск по белому списку, но мне все еще не ясно, к какому файлу * .conf (если это * .conf), к которому добавляются устройства из белого списка, я предполагаю, что кто-то здесь будет знать, что, например их рука.

Так что да, брандмауэры? белый список? Любой другой совет, как я мог бы отладить это, был бы велик. Спасибо за ваше время,

ОБНОВЛЕНИЕ: Со вчерашнего дня я установил firewalld и переставил все зоны брандмауэра, указанные в раскрывающемся меню в Network Manager GUI, чтобы посмотреть, есть ли они позволят сокету принять соединение. К сожалению, не повезло.

Я также добавил в iptables правила, разрешающие весь трафик TCP c через порт 50001 (INPUT и OUTPUT). Также не повезло.

...