2014-12-26 82 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

當我踏進去,他們成爲空

in callback

我不知道什麼會導致這種情況,回調函數是直接從官方的例子,所以沒有什麼應該是錯誤的。

回答

2

好的,解決了這個問題,看起來'union sctp_sockstore addr'之前的參數導致堆棧被0x1c推送並將其餘參數從應該在的位置移開。我從來沒有遇到過這個問題,但將參數改爲固定它的指針。

+1

我確認,直到現在在usrsctp中,根據不同的編譯器選項,可能會出現問題: 32 == sizeof(addr) - 在libusrsctp中,16 == sizeof(addr) - 在用戶代碼中。 –