2

我目前正在创建一个在 Windows 上使用 usrsctp 库的网络应用程序,当参数不应该在回调函数上时,我遇到了一个奇怪的问题,即参数显示为 null。我不确定这是否是特定的 usrsctp 问题还是我做错了什么,所以我想先在这里检查一下。

创建新的 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;
}

跟踪库我可以看到在调用回调之前所有参数都是正确的

回调前

一旦我踏入它,它们就会变为空

在回调中

我不知道是什么原因造成的,回调函数直接取自官方示例,所以那里应该没有错。

4

2 回答 2

2

好的,解决了这个问题,似乎“union sctp_sockstore addr”之前的参数导致堆栈被 0x1c 推送,并将其余参数移离它们应该在的位置。我以前从未遇到过这个问题,但是将参数更改为指针修复了它。

于 2014-12-26T16:12:45.663 回答
0

我有同样的问题,在我的情况下,原因是 INET 缺少定义。由于“union sctp_sockstore”的大小取决于此定义。因此,您必须确保使用与编译库时相同的定义。

于 2018-07-18T15:17:08.310 回答