Перейти к содержанию
    

Проблемы с TCP и C++ в Angstrom (BBB)

День добрый! Столкнулся с проблемой на BeagleBoneBlack (angstrom) хотя, мне кажется, что ошибка не связана с ситемой.

Дано:

1. Я могу послать TCP пакет от BBB на внешний сервер через командную строку, и все работает

echo " 11111" > /dev/tcp/81.23.XX.XX/5555

2. Я не могу подключиться к серверу из приложения (код ниже, возникает Timeout error при попытке подключения) но! я могу послать пакет без проблем если разверну серверное ПО в своей локальной сети. Т.е. код вроде бы рабочий.

Карта сети:

BBB(192.168.1.7) -> Мой роутер (static IP 212.четотам... ) -> ... -> ... -> ServerRouter(81.23.XX.XX) -> Server(192.168.4.55)

На другом конце стоит роутер который пробрасывает порт на сервер без выделенного IP.

Мой компьютер подключен к моему роутеру по wifi.

 

При этом, что странно:

Мой копм посылает на сервер без проблем.

BBB посылает на мой комп без проблем

BBB посылает на сервер из командной строки, но не из приложения...

 

Видимо, где-то проблема в коде, но где? Помогите)

 

BBTcpErrorCode BBTCPClient::connectToServer(string serverIpAddr,
int serverPort) {
//создаем сокет
LOG("Create socket...");
if ((m_socket = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
return BBTCP_SOCKETERROR;
}
LOG("Socket created!");


/* Обнуляем переменную m_addr и забиваем её нужными значениями */
bzero(&m_addr, sizeof(m_addr));
m_addr.sin_family = AF_INET;  // обязательно AF_INET!
m_addr.sin_port = htons(serverPort); // 0 - выдать порт автоматом
/* Переводим адрес в нужный нам формат */
if (inet_aton(m_IpAddr.c_str(), &m_addr.sin_addr) == 0) {
LOG_INT("Error assign IP ADDR!", errno);
return BBTCP_ADDRERROR;
}


const int on = 1;
setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof on);


/* Биндим сокет */
if (bind(m_socket, (struct sockaddr*) &m_addr, sizeof(m_addr)) < 0) {
LOG_INT("Error bind socket!", errno);
return BBTCP_BINDERROR;
}


/* Обнуляем переменную s_addr и забиваем её нужными значениями */
bzero(&s_addr, sizeof(s_addr));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(serverPort);
/* Переводим адрес в нужный нам формат */
if (inet_aton(serverIpAddr.c_str(), &s_addr.sin_addr) == 0) {
return BBTCP_ADDRERROR;
}


if (connect(m_socket, (struct sockaddr*) &s_addr, sizeof(s_addr)) < 0) {
return BBTCP_CONNECTERROR; // <- When I try to send to 82.XX.XX.XX this error arise after ~ 1 minute ( errno = 101 -- timeout )
}

return BBTCP_OK;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно, сниффер тут поможет, особенно если на промежуточных компах ловить, кто же глотнул пакет или не туда заслал.

UDP аналогично проходит ? Пинги, допустим.

На самом деле, один "TCP пакет" из себя представит кучу пинг-понгов меж сторонами, и можно сравнивать логи сниффера в хорошем и плохом случае.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

UDP не пробовал, попробую. Т.е. Вы считаете что кто-то по пути следования пакета его не пропускает? А чем в этом случае отличается посылка пакетта через сокет и через консоль linux? Не должны маршруты совпадать? Я подумал что если из консоли устанавливается связь, то виноват чисто исходный код в том, что пакет не дошел...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...