linux中sctp的实现问题!!

a1421117 2015-05-27 12:40:43
在看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的这个层次问题,导致服务器没办法阻塞在这个函数等待客户端的输入,服务器程序因此跑不起来

到底时我环境搭的有问题,
...全文
903 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sodawaterer 2017-05-31
  • 打赏
  • 举报
回复
引用 2 楼 a1421117 的回复:
[quote=引用 1 楼 FightForProgrammer 的回复:] 用网络监测工具看看发包、解包的报文吧
您指的是tcpdump吗??? 关键是没有办法抓包,服务器程序根 跑不起来,原意是服务器程序阻塞在sctp_recvmsg上,等待客户端发送消息过来,但是现在服务器在sctp_recvmsg上不阻塞,直接返回错误:资源暂时不可用[/quote]怎么样呢/我也遇到同样的问题了,不阻塞,总是直接返回-1
FightForProgrammer 2015-05-28
  • 打赏
  • 举报
回复
用网络监测工具看看发包、解包的报文吧
a1421117 2015-05-28
  • 打赏
  • 举报
回复
引用 1 楼 FightForProgrammer 的回复:
用网络监测工具看看发包、解包的报文吧
您指的是tcpdump吗??? 关键是没有办法抓包,服务器程序根 跑不起来,原意是服务器程序阻塞在sctp_recvmsg上,等待客户端发送消息过来,但是现在服务器在sctp_recvmsg上不阻塞,直接返回错误:资源暂时不可用

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧