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'
sctp_get_no_strms’
sctpserv01.c:(.text+0x1d5): undefined reference to
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
//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.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
,工作正常。
- UNIX网络编程—SCTP编译运行错误及解决
- SCTP编译运行错误及解决
- unix 网络编程--SCTP
- UNIX网络编程——基本SCTP套接字编程
- UNIX网络编程编译错误修订
- UNIX网络编程读书笔记:基本SCTP套接口编程
- UNIX网络编程--传输层:TCP、UDP、SCTP(二)
- unix网络编程---读书笔记(一)---tcp/udp/sctp简介
- Unix网络编程二:传输层:TCP、UDP、SCTP
- UNIX网络编程1:传输层协议TCP、UDP、SCTP
- Unix网络编程(卷二)unpv 源码下载及编译报错解决
- 关于编译unix网络编程第二卷--进程间通信源代码的问题及解决
- unix网络编程-编译
- UNIX网络编程卷2源码编译错误
- Unix网络编程代码下载安装及编译
- 编译UNIX网络编程源代码
- 《unix网络编程》源码编译
- unix网络编程源代码编译
- 前序遍历序列和中序遍历序列构造二叉树算法
- easyui的numberbox赋值问题,不能用$('userId').val('aaa');赋值
- 从Unity引擎过度到Unreal4引擎(最终版)
- 第一次为了acm练习盲打
- Spark进阶学习——Stage划分
- UNIX网络编程—SCTP编译运行错误及解决
- HACMP下HDLM特殊配置/HDLM卸载
- 设置ARC工程兼容非ARC
- webview加载H5页面使用本界面且可以点击(浏览器不会跳转)
- Swift学习(一)
- 14.4.1 InnoDB Startup Configuration
- c# Thread
- 收录几段DEP方法后置脚本
- GoldenGate、DataGuard与Stream Replication在数据同步和迁移方面的区别—理论篇