环境:
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 tosctp_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组服务器客户端测试即关于sctpserv01和sctpclient01相关的内容。下面内容以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
//Makefile
include ../Make.defines
PROGS = sctpserv01 sctpclient01 sctpserv02 sctpserv03 sctpclient02 sctpserv04 \
sctpserv05 sctpclient03 sctpserv06 sctpserv07 sctpclient04 sctpserv_fork
LIBS+= -L/usr/local/v6/lib -lm -lsctp
.c.lc:
../../troff/fixcode.sh $< > $@
.h.lh:
../../troff/fixcode.sh $< > $@
CFLAGS+= -g
all: ${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 sctpserv01
make 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.c和sctp_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);
}
重新编译并运行sctpserv01和sctpclient01,工作正常。