Jump to content

    

Проблемы с 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;
}

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this