P.S. На хосте установлена Windows XP
LPC1768. Проблема с ethernet
Суть в следующем. Есть микроконтроллер LPC1768, который, используя DP83848C, посылает UDP-пакеты в ответ на пришедший от хоста UDP-пакет. Wireshark всё показывает как надо: есть ARP от хоста, есть ответ от микроконтроллера, затем есть UDP-пакет от хоста и есть ответный UDP-пакет от микроконтроллера. Однако, при попытке поймать этот ответный пакет в моей программе ничего не выходит. Функция recvfrom не возвращает пакет данных и завершается по таймауту... Кто с таким сталкивался? Подскажите, что за хрень... Почему сниффер видит пакет, а winsock нет?
P.S. На хосте установлена Windows XP
P.S. На хосте установлена Windows XP
Tais sa gueule et écoute un silence
- Реклама
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Не сильный спец по этим вопросам. Делал связь микроконтроллера (сервер AVR+WIZ810) с планшетом на андроиде, было подобное пакеты видны снифером а не доходят. Помогла смена номера порта сервера.
Вопрос - плату на LPC1768 сами делали или покупная? Надо мне перевести проект с AVR на более мощный микроконтроллер. Собираю информацию.
Вопрос - плату на LPC1768 сами делали или покупная? Надо мне перевести проект с AVR на более мощный микроконтроллер. Собираю информацию.
Сначала делал на отладочной плате EM-LPC1700, сейчас пересел на другую, сделанную на заводе.
К сожалению не помогла смена номера порта. Даже если ставить разные для контроллера и компа... Нет приёма через recvfrom. Выложу исходник программы, которая косячит. Может кто увидит проблему...
К сожалению не помогла смена номера порта. Даже если ставить разные для контроллера и компа... Нет приёма через recvfrom. Выложу исходник программы, которая косячит. Может кто увидит проблему...
Код: Выделить всё
WSADATA wsa;
int eth_ok = 0;
if ( WSAStartup(MAKEWORD(2, 0), &wsa) == 0 )
{
s = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
unsigned long n = 2000;
setsockopt( s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&n, 4 );
if ( s != INVALID_SOCKET )
{
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_port = 0;
sa.sin_addr.s_addr = ADDR_ANY;
if ( bind(s, (SOCKADDR*)&sa, sizeof(SOCKADDR)) != 0 )
return;
}
else
return;
}
else
return;
sa.sin_family = AF_INET;
sa.sin_port = htons( 34085 );
sa.sin_addr.s_addr = inet_addr( "192.168.0.112" );
unsigned char *buf;
unsigned short *res;
int n, m, k, z;
struct UOSHDR *ptr;
n = sizeof( struct UOSHDR );
buf = new unsigned char[ n ];
ptr = (struct UOSHDR*) buf;
m = 6;
res = new unsigned short[ m ];
ptr->id = id++;
ptr->cmd = 1;
ptr->addr = 0;
ptr->len = 4;
k = sendto( s, buf, n, 0, (SOCKADDR*)&sa, sizeof(SOCKADDR) );
z = sizeof( SOCKADDR );
ZeroMemory( &sa, z );
k = recvfrom( s, (char*)res, m << 1, 0, (SOCKADDR*)&sa, &z );
z=WSAGetLastError();
delete[] buf;
delete[] res;
closesocket( s );
WSACleanup();
Последний раз редактировалось brutal Пн окт 22, 2012 17:50:15, всего редактировалось 1 раз.
Tais sa gueule et écoute un silence
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Спасибо. Еще б скромно посоветовал (мне очень помогло) написать на PC и клиент и проверить связь с хостом пока без микроконтроллера. Писал на джаве.
Проблема, конечно, видна - вы не обрабатываете коллбековские события и настраиваете, собственно, тоже неправильно. Я здесь целую оперу написал по этой теме.
http://kazus.ru/forums/showthread.php?t=39109&page=2
http://kazus.ru/forums/showthread.php?t=39109&page=2
- Реклама
Если в строкеurry писал(а):Проблема, конечно, видна - вы не обрабатываете коллбековские события и настраиваете, собственно, тоже неправильно
Код: Выделить всё
sa.sin_addr.s_addr = inet_addr( "192.168.0.112" );Я прочитал вашу статью, но там описана работа с TCP-сокетами. У меня же реализован гораздо более простой UDP-протокол. Если вас не затруднит, то скажите что я неправильно настраиваю
Tais sa gueule et écoute un silence
Простите, предыдущий вариант неверный. Поправил под UDP
- Вложения
-
- kot_connect.zip
- (83.65 КБ) 228 скачиваний
не помогло. я уже даже сам накидал по мотивам ваших постов исходник работающий через wsaasyncselect и windows messages. закрадываются сомнения что вероятно проблема в приходящих udp-пакетах от микроконтроллера... но wireshark ошибок не находит и отображает все принятые от контролера udp-пакеты как корректные. фигня какая-то...
Tais sa gueule et écoute un silence
только что проверил на 2 соседних машинах - передача туда и обратно идет.
Посмотрите, может что с файерволом - добавить исключение на порт 34085, проверьте правильность установки своего айпишника и того, кому посылаете.
Код рабочий.
Посмотрите, может что с файерволом - добавить исключение на порт 34085, проверьте правильность установки своего айпишника и того, кому посылаете.
Код рабочий.
Спасибо, urry, за помощь, вопросов к вашему коду нет - он работает и у меня на разных машинах.
Проблема была в UDP-пакете, который формируется микроконтроллером. Дело в том, что я не обнулял поле
контрольной суммы заголовка UDP. При этом, похоже, что windows пересчитывала КС и отбрасывала пакет =)
Сбил с толку меня тот факт, что wireshark никак не реагировал на неверную контрольную сумму, указанную в
заголовке UDP
Проблема была в UDP-пакете, который формируется микроконтроллером. Дело в том, что я не обнулял поле
контрольной суммы заголовка UDP. При этом, похоже, что windows пересчитывала КС и отбрасывала пакет =)
Сбил с толку меня тот факт, что wireshark никак не реагировал на неверную контрольную сумму, указанную в
заголовке UDP
Tais sa gueule et écoute un silence
А он и не будет реагировать - он забирает пакеты из карточки до того момента, как они выпрыгнут - а карточки формируют контрольную сумму самостоятельно - поэтому кс может не быть правильной. В хелпе по акуле это оговаривается.wireshark никак не реагировал на неверную контрольную сумму
ПС почему ответил только сейчас - недавно сам накололся....


