2014-12-26 4 views
2

현재 Windows에서 usrsctp 라이브러리를 사용하는 네트워크 응용 프로그램을 만들고 있는데 콜백 함수가 아니어야 할 때 매개 변수가 null로 나타나는 이상한 문제가 있습니다. 이것이 특정 usrsctp 문제인지 아니면 내가 잘못하고있는 것인지 확실하지 않아서 여기에서 먼저 확인하고 싶습니다.C++ usrsctp 콜백 매개 변수 null

당신은 내가 그것을 볼 수있는 라이브러리를 통해 추적

static int receive_cb(struct socket *sock, union sctp_sockstore addr, void *data, 
size_t datalen, struct sctp_rcvinfo rcv, int flags, void *ulp_info) 
{ 
    if (data == NULL) { 
     printf("receive_cb - Data NULL, closing socket...\n"); 
     done = 1; 
     usrsctp_close(sock); 
    } 
    else { 
     _write(_fileno(stdout), data, datalen); 
     free(data); 
    } 
    return (1); 
} 

... 
//Create SCTP socket 
if ((sctpsock = usrsctp_socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP, receive_cb, NULL, 0, NULL)) == NULL) { 
    perror("usrsctp_socket"); 
    return -1; 
} 

아래의 코드에서와 같이 데이터가 수신 될 때 호출 할 매개 변수 중 하나로서 기능을 전달할 새로운 SCTP 소켓을 만들 때 통화가 다시 호출되기 전에 모든 매개 변수 내가 그것으로 단계로

Before callback

는 즉시이 null이 될 올바른

콜백 함수는 공식 예제에서 직접 가져온 것이므로 아무 것도 잘못해서는 안됩니다.

답변

2

좋아, 문제를 해결, 그것은 '노조 sctp_sockstore addr'하기 전에 매개 변수를 스택을 0x1c에 의해 밀어 넣기 및 나머지 매개 변수가 있어야합니다 위치에서 멀리 이동하는 것으로 보인다. 전에는이 문제를 보지 못했지만 매개 변수를 포인터로 변경하면 문제가 해결되었습니다.

+1

다른 컴파일러 옵션에 따라 지금까지 usrsctp에서 확인할 수 있습니다. 32 == sizeof (addr) - libusrsctp에서 16 == sizeof (addr) - 사용자 코드에서. –