在看unp这本书,书中sctp的代码在linux中各种不正常!希望高手解答
测试环境是ubuntu12.04 kernel 3.2.13和centos6.6 kernel 2.6.32
ubuntu12.04用apt-get安装了libsctp-dev,和lksctp的包
centos6.6用yum安装了lksctp*搜索出来的三个软件包
首先用unp下的./configure并不能正确的识别系统已经支持了sctp,必须手动在config.h中定义HAVE_NETINET_SCTP_H宏,来包含unp中sctp.h头文件
我不知道是因为我在linux下面的sctp环境没有安装完全,还是别的什么原因,在linux中sctp有如下问题:
1、关于通知,linux中有一个SCTP通知没有定义:SCTP_ADAPTION_INDICATION(适配层错误),这个事件在linux内核中并没有提 供
2、sctp_address_to_associd这个函数在linux中无法根据对端地址获得sctp关联,
原因为Linux的实现中,会把函数sctp_opt_info的第二个参数"sctp_assoc_t id"的值(这个值为可能存在的sctp关联标识),直接填 入struct sctp_paddrparams这个结构体的成员sctp_assoc_t app_assoc_id中,而不是根据你所期望的:根据你所填入对端地址,返回关联标识。
3、Linux没有提供sctp无序发送的支持,头文件中没有定义标志"MSG_UNORDERED"
4、在Linux中,监听套接字(调用listen所在的位置)所在的函数栈,与sctp_recvmsg所在的函数栈不能相隔层次过多,否则,sctp_recvmsg会直接返回"资源暂时不可用"
例如:在centos6.x中:
main
{
Listen(...)
{
listen(...) //在此处调用listen
}
Sctp_recvmsg(...)
{
sctp_recvmsg(...) //在此处调用sctp_recvmsg
}
}
//此种情况在centos6.x中,sctp_recvmsg会直接返回"资源暂时不可用"
例如:在ubuntu12.04中(相隔的层次会比centos6.x多一层)
main
{
Listen(...)
{
listen(...) //在此处调用listen
}
SCTP_recvmsg(...)
{
Sctp_recvmsg(...)
{
sctp_recvmsg //在此处调用sctp_recvmsg
}
}
}
//此种情况在ubuntu12.04中,sctp_recvmsg会直接返回"资源暂时不可用"(centos中的情况,在ubuntu中运行正常)
//也就是说ubuntu12.04,能比centos6.x中多兼容一层。
另外,在unp的代码中,有些常值宏定义在linux中也没有,我手动定义后程序也勉强可以运行,他们是:SERV_MAX_SCTP_STRM(默认流的数目),SERV_MORE_STRMS_SCTP(增加关联中流的数目)等等。
另外在能运行的程序中,也不是完全正常,比如用sctp_sendmsg向每一个流中写入数据,然后用sctp_recvmsg中从每一个流中读取数据时,流0总是会读取两次,等等异常问题。
但是sctp_recvmsg的这个层次问题,导致服务器没办法阻塞在这个函数等待客户端的输入,服务器程序因此跑不起来
到底时我环境搭的有问题,