2014-12-26 5 views
2

В настоящее время я создаю сетевое приложение, использующее библиотеку usrsctp для окон, и у меня возникает нечетная проблема с параметрами, которые отображаются как null, когда они не должны быть в функции обратного вызова. Я не уверен, что это конкретная проблема usrsctp или что-то, что я делаю неправильно, поэтому я хотел сначала проверить здесь.Параметры обратного вызова C++ usrsctp null

При создании нового ScTP сокета вы передаете функцию в качестве одного из параметров, которые вы хотите назвать, когда данные получены, как показано в коде ниже

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; 
} 

Трассировка через библиотеку, я могу видеть, что до обратного вызова вызывается все параметры являются правильными

Before callback

Как только я ступаю на него они утрачивают

in callback

Я не знаю, что могло бы вызвать это, функция обратного вызова была взята прямо из официальных примеров, поэтому в этом нет ничего плохого.

ответ

2

Хорошо, выработав проблему, кажется, что параметр до 'union sctp_sockstore addr' заставлял стек быть нажатым 0x1c и перемещать остальные параметры вдали от того места, где они должны быть. Я никогда не сталкивался с этой проблемой раньше, но изменение параметра на указатель исправил его.

+1

Я подтверждаю, что до сих пор в usrsctp, в зависимости от разных параметров компилятора, возникает проблема: 32 == sizeof (addr) - in libusrsctp, 16 == sizeof (addr) - в коде пользователя. –