2014-03-05 2 views
0

가 나는 Beaglebone 블랙오류 -이 지속적으로</p> <p>"예외가 슬로우됩니다 예외를 던지는 MOOS 데이터베이스를 실행하기에

MOOS-IvP를 실행하려고하고 Beaglebone 블랙에 MOOS - IVP를 실행할 수 없습니다 루프를 듣고 :. 소켓 동작에 오류 듣기는 "지원되지

이 소프트웨어는 문제가 될 수있는 어떤 라즈베리 파이

어떤 아이디어에서 실행?

+0

단일 스레드 모드에서 작동하도록 할 수 있습니다. BBB – user3382553

+0

Ok에 여러 스레드를 실행하는 데 문제가 있습니다. 디버깅을 많이 한 후에 Listen 스레드 소켓을 시작하면 TCP 소켓이어야 할 때 UDP 소켓 (lsof를 사용하여 결정됨)으로 시작됩니다. 이게 뭐야? – user3382553

답변

0

문제점을 발견하여 해결했습니다.

소켓을 만들 때 TCP가되어야합니다. 그러나 XPCGetProtocol 클래스에서 getprotobyname (_sName)을 호출하여/etc/protocols에서 정확한 프로토콜 번호를 조회하면 이전에 호출 된 시간 (UDP 소켓을 설정 한 시간)을 반환합니다.

간단히 말해서이 함수를 두 번 호출 했으므로 두 번째로 올바른 값을 반환합니다.

왜 처음에는 틀렸을까요?

0

또한 우분투 14.04를 실행하는 BeagleBone Black 작업 중에이 오류가 발생했습니다. 그러나 요청을 두 번 실행하는 솔루션이 작동하지 않았습니다. 더 많은 문제 해결을 통해 다른 프로세스가 UDP 소켓을 연 후에 TCP 소켓으로 간주되는 소켓이 열렸는지 확인할 수있었습니다. getprotobyname()에 의해 반환 된 구조는 호출에서 호출로 변경되지 않지만 프로토콜 세부 사항으로 업데이트됩니다 (다른 Unix 운영체제에서는 here 참조). 따라서 다른 프로세스의 두 번째 호출은 원래 세부 정보를 덮어 씁니다.

그러면 생성자에서 소켓을 생성하는 동안 XPCSocket의 테스트를 거치며 결과적으로 TCP 소켓이어야하는 UDP 소켓이 만들어집니다. 이것은 아마도이 함수에 락을 추가함으로써 고칠 수 있지만, socketProtocol 구조체에서 반환 된 문자열 대신 생성자가 호출 된 문자열 (_sProtocol)을 사용하여 요청 된 프로토콜을 초기화하기 위해 non-blocking 방식을 취했습니다. 또한 XPCGetProtocol 클래스에서 프로토콜 번호를 getprotobyname()을 호출 할 때 변경되지 않는 멤버 변수에 저장하도록 수정했습니다.

내 수정 사항은 here입니다.