Проще говоря, я запускаю основную 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). Также не повезло.