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+= -gall:   ${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+= -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.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,工作正常。

UNIX网络编程—SCTP编译运行错误及解决相关推荐

  1. unix网络编程源代码编译

    最近开始研究unix网络编程,正所谓"学习网络编程的最好方法就是下载这些程序,对其进行修改和改进.只有这样才能深入理解与有关概念和方法". 1.首先下载源代码,不多说了: 2.照着 ...

  2. 《Unix网络编程卷1-套接字联网API》第一个例子编译 不通过问题解决

    <Unix网络编程卷1-套接字联网API>是本好书. 但是第一个例子不是很好编译. 需要如下步骤: 本人机器CentOS 5.4 1.下载源码 unpv13e解压到任意目录 然后按其rea ...

  3. 《UNIX网络编程 卷1:套接字联网API(第3版)》——第2章 传输层:TCP、UDP和SCTP 2.1概述...

    本节书摘来自异步社区<UNIX网络编程 卷1:套接字联网API(第3版)>一书中的第2章,第2.1节,作者:[美]W. Richard Stevens , Bill Fenner , An ...

  4. 《Unix网络编程(第3版)》代码编译的一些问题

    现在学习<UNIX网络编程(第3版)>一书,书中源代码有一些默认情况下编译不能通过,要经过一些修改都行.这编文档将记录下我遇到的不能正常编译的程序的修改步骤. 28章:traceroute ...

  5. UNIX网络编程之旅-配置unp.h头文件环境

    最近在学习Unix网络编程(UNP),书中steven在处理网络编程时只用了一个#include "unp.h"  相当有个性并且也很便捷 于是我把第三版的源代码编译实现了这个过程 ...

  6. 《UNIX网络编程卷1》第一例及问题

    <UNIX网络编程卷1>一上来就给了一个例子,新手不容易看懂,估计作者也没有打算让人看懂,作了详尽的解释.新手都想运行这个程序,我也是. 首先,给的程序都是在unix下运行的.这里有全书代 ...

  7. 再读Socket编程——《UNIX网络编程(卷一)》学习点滴

    原先曾以Socket编程为入口开始自己的新的学习,毕竟未曾致用,时至今日已比较生疏.借着阅读<UNIX网络编程(卷一)>(简称UNPv1)的机会,正好复习一番,而且希望将新的感受记录下来. ...

  8. Unix网络编程 chart

    前言 在最初接触网络这一领域的时候,就是傻傻地抱着一本TCP/IP协议详解来学习,主要学习协议的原理并研究协议相关的算法,大家都知道协议纯理论的学习是比较枯燥和复杂的,看着看着就睡着了.由于项目需要, ...

  9. UNIX网络编程.卷1,套接字联网API(第3版)(中文版)(Stevens经典著作,两位顶级网络编程专家应邀执笔修订)...

    UNIX网络编程.卷1,套接字联网API(第3版)(中文版)(Stevens经典著作,两位顶级网络编程专家应邀执笔修订) 基本信息 原书名: Unix Network Programming, Vol ...

最新文章

  1. IOS开发笔记12-Object-C中的对象与内存
  2. linux centos rc.local 自启动无效 解决方法
  3. C++ 模板详解(一)
  4. JAVA——开启多线程的方法汇总
  5. 聊聊毕业设计系列 --- 系统实现
  6. Socket编程实践(7) --Socket-Class封装(改进版v2)
  7. mysql中外键总结_mysql外键的一些总结
  8. 在iphone上安装多个微信 【微信营销必备】
  9. java去0,Java如何处理除零?
  10. matlab飞机降落过程模拟,scratch作品 “模拟飞机降落”---东风东路小学一年(14)班 沈宸玮...
  11. systrace打印
  12. 矢量网络分析仪--测天线时使用技巧
  13. JAVA-银行卡归属地查询
  14. 【壁纸小程序】搭建自己的壁纸小程序-微信抖音双端
  15. java分词取词_中文自动分词技术
  16. 关于第一次深度学习项目的总结
  17. Clojure 学习入门(18)—— 数据类型
  18. 一款Java开源的SpringBoot即时通讯IM 聊天系统
  19. 同一个表单form,两个按钮button,调用同一个submit(),给action附不同的参数
  20. Spring基础----相关类

热门文章

  1. 数据可视化大屏设计步骤,有3步流程
  2. php $.ajaxfileupload,ajaxfileupload上传时出现的问题详解
  3. 离不开的办公文档——OFFICE,OFFICE大客户版本安装部署
  4. 自动化脚本之SCRT
  5. 用宏杉存储oracle重启,Redhat6主机系统Oracle11g数据库异常重启问题
  6. 光场技术的过去,现在和未来
  7. ad15的stc元件库_STC单片机 STC15F系列单片机 Altium PROTEL 设计的器件原理图+PCB封装库文件...
  8. SCOR提供了一套集成的、启发式的方法模型
  9. UML画图文档之汇总
  10. 如何查看删了的通话记录