请教Linux下SCTP问题

ch888168930 2012-02-13 10:50:57
初学网络编程。在fedra13下,在网上下了sctp的源代码,编译,安装成功,lsmod里也有相应模块,[root@localhost bin]# ./checksctp 返回 SCTP supported,安装没问题,支持SCTP协议。但是bind()返回的结果是 bind err: Permission denied 端口没被占用,不知道什么原因,求大神指导下

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netinet/sctp.h>
#include<strings.h>
#define BUFFSIZE 1024
#define SERV_PORT 9006
int sys_err( char const* value )
{
perror(value);
return 1;
}

int main(int argc, char *argv[])
{
int sock_fd,msg_flags;
char readbuf[BUFFSIZE]={0};
struct sockaddr_in servaddr,cliaddr;
struct sctp_sndrcvinfo sri;
struct sctp_event_subscribe events;
int stream_increment = 1;

socklen_t len;
size_t rd_sz;

if(argc ==2 )
return sys_err("please input the IPaddr");
sock_fd = socket(AF_INET,SOCK_SEQPACKET,IPPROTO_SCTP);
if(sock_fd <0)
return sys_err("socket error");
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
if( bind(sock_fd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0 )
return sys_err("bind err");

bzero(&events,sizeof(events));
events.sctp_data_io_event = 1;
if(setsockopt(sock_fd,IPPROTO_SCTP,SCTP_EVENTS,&events,sizeof(events))<0)
return sys_err("setsockopt err");

listen(sock_fd,5);

while(1){
len = sizeof(struct sockaddr_in);
rd_sz = sctp_recvmsg(sock_fd,readbuf,sizeof(readbuf),
(struct sockaddr*)&cliaddr,&len,
&sri,&msg_flags);
/* if( stream_increment ){
sri.sinfo_stream ++;
if(sri.sinfo_stream >= sctp_get_no_strms(sock_fd,(struct sockaddr*)&cliaddr,len))
sri.sinfo_stream = 0;
}
*/
sctp_sendmsg(sock_fd,readbuf,rd_sz,
(struct sockaddr*)&cliaddr,len,
sri.sinfo_ppid,
sri.sinfo_flags,sri.sinfo_stream,0,0);
}
}


编译和运行均在root用户下,GDB后,用lsof -p 。。。得
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sctpserv0 19219 root cwd DIR 253,2 4096 1187475 /home/micky/workspace/LearnC/network
sctpserv0 19219 root rtd DIR 253,0 4096 2 /
sctpserv0 19219 root txt REG 253,2 11601 1188695 /home/micky/workspace/LearnC/network/sctpserv01
sctpserv0 19219 root mem REG 253,0 1855564 1835725 /lib/libc-2.12.so
sctpserv0 19219 root mem REG 253,0 141492 1835689 /lib/ld-2.12.so
sctpserv0 19219 root mem REG 253,0 27354 284797 /usr/local/lib/libsctp.so.1.0.11
sctpserv0 19219 root 0u CHR 136,1 0t0 4 /dev/pts/1
sctpserv0 19219 root 1u CHR 136,1 0t0 4 /dev/pts/1
sctpserv0 19219 root 2u CHR 136,1 0t0 4 /dev/pts/1
sctpserv0 19219 root 3r FIFO 0,8 0t0 67663 pipe
sctpserv0 19219 root 4w FIFO 0,8 0t0 67663 pipe
sctpserv0 19219 root 5r FIFO 0,8 0t0 67664 pipe
sctpserv0 19219 root 6w FIFO 0,8 0t0 67664 pipe
sctpserv0 19219 root 7u sock 0,6 0t0 67683 can't identify protocol
sctpserv0 19219 root 12r FIFO 0,8 0t0 20495 pipe
sctpserv0 19219 root 13w FIFO 0,8 0t0 20495 pipe

can't identify protocol 这是为什么?
...全文
433 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
试试 setenforce 0 后再执行。
cscience 2013-08-21
  • 打赏
  • 举报
回复
最近在研究SCTP,查找sctp_get_no_strms这个函数居然找到了这个帖子,试试回复一下吧。 在kernel代码中,sctp_bind在 if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE)) return -EACCES; 时,才返回EACCES(Permission denied)。因此,从代码来分析,LZ的代码中 servaddr.sin_port = htons(SERV_PORT); SERV_PORT应该是小于PROT_SOCK(1024)的端口,并且LZ运行代码时,应该不是在root,否则不会出现这个问题。LZ可以试试将SERV_PORT改成一个大于1024的值,或者确定是在root下运行
ch888168930 2012-02-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qq120848369 的回复:]
SCTP得安装吧
[/Quote]
已经安装了啦,安装后调用它的 checksctp程序,返回说支持sctp了,lsmod里也加载了相应的模块了
qq120848369 2012-02-13
  • 打赏
  • 举报
回复
SCTP得安装吧

23,217

社区成员

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

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