2012-11-19 3 views
1

현재 내 필요에 맞게 Dennis Bush의 UFTP (http://uftp-multicast.sourceforge.net)를 수정 중입니다. 현재 내가하려고하는 것은 클라이언트가 COMPLETE 메시지를 보내는 주소를 변경하는 것입니다. 수정 된 버전의 UFTP 클라이언트가 서버에 유니 캐스팅하지 않고 COMPLETE 메시지를 멀티 캐스트하도록합니다. 멀티 캐스트 그룹의 모든 클라이언트가 전송되는 COMPLETE 메시지를 볼 수 있어야하기 때문입니다. 섬기는 사람.가능한 원인 errno 97 aka EAFNOSUPPORT aka 프로토콜에 의해 지원되지 않는 주소 패밀리

UFTP의 저자는 내가 완료를 전송하고자하는 나는 개인 멀티 캐스트 주소와 포트를 포함하는 구조에 client_transfer.c, 라인 359, nb_sendto() 함수 호출, 5 인수을 수정해야한다고 얘기하고있다 . 불행히도 "프로토콜에 의해 지원되지 않는 주소 패밀리"오류가 발생합니다. 코드 섹션은 다음과 같이 원래이었다

if (nb_sendto(listener, outpacket, payloadlen, 0, 
       (struct sockaddr *)&group_list[listidx].replyaddr, 
       sizeof(struct sockaddr_in)) == SOCKET_ERROR) { 
     sockerror(group_list[listidx].group_id, group_list[listidx].file_id, 
       "Error sending COMPLETE"); 
    } else { 
     log(group_list[listidx].group_id, group_list[listidx].file_id, 
       "COMPLETE sent"); 
    } 
    set_timeout(listidx); 

    free(buf); 
    free(encrypted); 

나의 현재 코드는 다음과 같습니다

if (nb_sendto(listener, outpacket, payloadlen, 0, 
     ////modified line: 
       (struct in_addr *)&group_list[listidx].multi.s_addr, //struct in_addr multi; 
     ////end of modified line 
       sizeof(struct sockaddr_in)) == SOCKET_ERROR) { 
     sockerror(group_list[listidx].group_id, group_list[listidx].file_id, 
       "Error sending COMPLETE"); 
    } else { 
     log(group_list[listidx].group_id, group_list[listidx].file_id, 
       "COMPLETE sent"); 
    } 
    set_timeout(listidx); 

    free(buf); 
    free(encrypted); 

오류는 매우 모호한, 나에게있다. 그것은 정확히 무엇을 의미합니까? 그러한 오류의 가능한 원인은 무엇입니까? 누군가가 올바른 방향으로 나를 가리킬 수 있을까요?

+1

음 ... 처음에는 호환되지 않는 유형 (in_addr! = sockaddr_in)을 사용하고있는 것 같습니다 ... 어쨌든 errno 97에 대해 더 알고 싶습니다. – deinocheirus

답변

2

당신이 sockaddr 후 문제가 단순히 예상되는 in_addr을 통과하는 경우 그 시스템 호출이 무엇을 생각하는 것은 그것이 어떻게 생각하는지에 주소 패밀리가 정말 바이트 중 하나보고하는 SOCKADDR 구조입니다 볼때 아마도 멀티 캐스트 주소는 유효한 주소 그룹이 아닙니다. 자세한 내용을 설명하기 위해

sockaddr_in는 다음과 같습니다

struct sockaddr_in { 
    sa_family_t sin_family; 
    in_port_t sin_port; 
    struct in_addr sin_addr; 
} 

그래서 in_addr가 당신이 제공되지 않으며, 대신 주소의 첫 번째 바이트로 처리되고 있는지 그 전에 가족 및 포트 번호 주소 패밀리.

+0

그래서 sockaddr에서 sockaddr_in으로 캐스팅합니까 – Stasik

관련 문제