UNIX网络编程—SCTP编译运行错误及解决

来源:互联网 发布:手机淘宝好评率 编辑:程序博客网 时间:2024/05/16 17:23

UNIX网络编程—SCTP编译运行错误及解决

环境

ubuntu 14.04 64bits
unpv13e


问题1 ‘redefinition of ‘struct in_pktinfo’

解决办法1

cd unpv13e/sctp/vi unp.h注释掉struct in_pktinfo部分

原因是该结构已经被包含在标准头文件bits/in.h中了。


问题2 undefined reference to ‘sctp_recvmsg’

依然是编译出现的问题,除了 sctp_recvmsg,还有:

sctpserv01.c:(.text+0x18d): undefined reference to sctp_recvmsg'
sctpserv01.c:(.text+0x1d5): undefined reference to
sctp_get_no_strms’
sctpserv01.c:(.text+0x248): undefined reference to `sctp_sendmsg’

解决办法2

这个解决办法就有些麻烦了,要修改Makefile文件。为了防止修改错误,最好是将原来的Makefile文件进行备份。

cd unpv13e/sctp/cp Makefile Makefile~

ok~我们现在对Makefile文件进行修改,因为Makefile里面对所有的demo源文件进行编译,我为了方便就仅仅修改了第1组服务器客户端测试即关于sctpserv01sctpclient01相关的内容。下面内容以diff -u的方式呈现

//修改后Makefile 修改前Makefile~cd unpv13e/sctp/diff -u Makefile~ Makefile//显示修改信息--- Makefile~  2016-06-22 10:19:10.410934352 +0800+++ Makefile    2016-06-22 11:21:52.482866980 +0800@@ -13,12 +13,12 @@ CFLAGS+= -g all:   ${PROGS}-sctpserv01:    sctpserv01.o -       ${CC} ${CFLAGS} -o $@ sctpserv01.o ${LIBS}+sctpserv01:    sctpserv01.o  sctp_wrapper.o sctp_getnostrm.o sctp_addr_to_associd.o+       ${CC} ${CFLAGS} -o $@ $^ ${LIBS}-sctpclient01:   sctpclient01.o sctp_strcli.o sctp_strcliecho.o-       ${CC} ${CFLAGS} -o $@ sctpclient01.o sctp_strcli.o sctp_strcliecho.o ${LIBS}+sctpclient01:   sctpclient01.o sctp_strcli.o sctp_strcliecho.o sctp_wrapper.o sctp_getnostrm.o sctp_addr_to_associd.o+       ${CC} ${CFLAGS} -o $@ $^ ${LIBS} sctpserv02:    sctpserv02.o 

修改结果显而易见,方便起见,此处贴出完整的Makefile,偷懒只修改了serv01和client01..lol

//Makefileinclude ../Make.definesPROGS = sctpserv01 sctpclient01 sctpserv02 sctpserv03 sctpclient02 sctpserv04 \sctpserv05 sctpclient03 sctpserv06 sctpserv07 sctpclient04 sctpserv_forkLIBS+= -L/usr/local/v6/lib -lm -lsctp.c.lc:    ../../troff/fixcode.sh $< > $@.h.lh:    ../../troff/fixcode.sh $< > $@CFLAGS+= -gall:    ${PROGS}sctpserv01: sctpserv01.o  sctp_wrapper.o sctp_getnostrm.o sctp_addr_to_associd.o        ${CC} ${CFLAGS} -o $@ $^ ${LIBS}sctpclient01:   sctpclient01.o sctp_strcli.o sctp_strcliecho.o sctp_wrapper.o sctp_getnostrm.o sctp_addr_to_associd.o        ${CC} ${CFLAGS} -o $@ $^ ${LIBS}sctpserv02: sctpserv02.o         ${CC} ${CFLAGS} -o $@ sctpserv02.o ${LIBS}sctpserv03: sctpserv03.o         ${CC} ${CFLAGS} -o $@ sctpserv03.o ${LIBS}sctpserv04: sctpserv04.o         ${CC} ${CFLAGS} -o $@ sctpserv04.o ${LIBS}sctpserv05: sctpserv05.o sctp_pdapircv.o         ${CC} ${CFLAGS} -o $@ sctpserv05.o sctp_pdapircv.o  ${LIBS}sctpserv06: sctpserv06.o sctp_displayevents.o        ${CC} ${CFLAGS} -o $@ sctpserv06.o sctp_displayevents.o  ${LIBS}sctpclient02:   sctpclient02.o sctp_strcli.o sctp_strcliecho.o        ${CC} ${CFLAGS} -o $@ sctpclient02.o sctp_strcli.o sctp_strcliecho.o ${LIBS}sctpclient03:  sctpclient01.o sctp_strcli_un.o sctp_strcliecho.o        ${CC} ${CFLAGS} -o $@ sctpclient01.o sctp_strcli_un.o sctp_strcliecho.o ${LIBS}sctpserv07: sctpserv07.o sctp_displayevents.o sctp_bindargs.o         ${CC} ${CFLAGS} -o $@ sctpserv07.o sctp_displayevents.o  sctp_bindargs.o ${LIBS}sctpclient04:   sctpclient04.o sctp_strcli1.o sctp_check_notify.o sctp_print_addrs.o sctp_modify_hb.o        ${CC} ${CFLAGS} -o $@ sctpclient04.o sctp_strcli1.o sctp_check_notify.o sctp_print_addrs.o ${LIBS}sctpserv_fork:  sctpserv_fork.o sctp_addr_to_associd.o        ${CC} ${CFLAGS} -o $@ sctpserv_fork.o sctp_addr_to_associd.o ${LIBS}clean:        rm -f ${PROGS} ${CLEANFILES}

修改完Makefile以后,在终端重新编译。

make sctpserv01make sctpclient01//顺利编译通过

问题3 getsockopt error: Invalid argument

跟TCP和UDP的套路一样,我们先在一个终端运行server,再在另一个终端运行client,按照UNP的内容进行调试:

//client shell./sctpclient01 127.0.0.1//block here[0]hello

在客户端终端没有回射回来任何内容,反而在运行服务器的终端打印出消息:

getsockopt error: Invalid argument

服务器进程异常退出。

解决办法3

参考StackOverFlow,按照里面的描述,需要对源代码进行修改,需要修改的两个文件是sctpserv01.csctp_getnostrm.c。依然以diff -u的形式给出。

1.修改sctpserv01.c

//修改sctpserv01.c--- sctpserv01_origin.c 2016-06-22 16:09:43.750557685 +0800+++ sctpserv01.c    2016-06-22 11:42:19.254845011 +0800@@ -35,7 +35,7 @@                 &sri,&msg_flags);        if(stream_increment) {            sri.sinfo_stream++;-           if(sri.sinfo_stream >= sctp_get_no_strms(sock_fd,(SA *)&cliaddr, len)) +           if(sri.sinfo_stream >= sctp_get_no_strms(sock_fd,(SA *)&cliaddr, len,sri))                 sri.sinfo_stream = 0;        }        Sctp_sendmsg(sock_fd, readbuf, rd_sz, 

2.修改sctp_getnostrm.c

--- sctp_getnostrm_origin.c 2016-06-22 16:13:38.654553478 +0800+++ sctp_getnostrm.c    2016-06-22 11:45:34.070841522 +0800@@ -1,15 +1,14 @@ #include   "unp.h" int -sctp_get_no_strms(int sock_fd,struct sockaddr *to, socklen_t tolen)+sctp_get_no_strms(int sock_fd,struct sockaddr *to, socklen_t tolen, struct sctp_sndrcvinfo sri) {    int retsz;    struct sctp_status status;    retsz = sizeof(status);     bzero(&status,sizeof(status));-   status.sstat_assoc_id = sctp_address_to_associd(sock_fd,to,tolen);-   Getsockopt(sock_fd,IPPROTO_SCTP, SCTP_STATUS,-          &status, &retsz);+   status.sstat_assoc_id = sri.sinfo_assoc_id;+   Getsockopt(sock_fd,IPPROTO_SCTP, SCTP_STATUS,&status, &retsz);    return(status.sstat_outstrms); }

重新编译并运行sctpserv01sctpclient01,工作正常。

1 0