前言
最近忙着复习考试,所以学习的进度变慢了,我原本定下来的计划是5月底看完这本书,但是现在才看了1/3,估计要拖到6月了。。。
现在我想换一个写博客的方式,不再一周一更了。一是因为现在忙着复习,一周的进度不多,二是感觉每周写一篇的内容实在太多了,没有一个专一的主题,写出来的博客我自己也不太想再读了。以后还是遇到什么问题,解决了之后就写一篇博客好了,长短无所谓,重点是解决了什么样的问题。
第十章SCTP客户/服务器的程序例子
这一章的编写的代码内容用上了不少在第九章里学到的SCTP套接字编程函数和设置内容,编写代码时需要不时的翻看之前的内容,也让我更清楚的明白了不要在第九章这里花费太多的时间,实际动手写一个程序,这些函数就都明白了。
P224页的SCTPserv01.c程序,我照着书本敲完了,结果编译的时候发现出现了未定义的情况
structsctp_sndrcvinfo
structsctp_event_subscribe
都没有定义。像这样结构体的定义,一般都是定义在.h文件之中,搜索/usr/include库之后,找到了sctp.h的头文件。
加入了该文件之后,结果出现了一大推的重定义,是和unp.h里的内容冲突了。显然,这时候有两种做法。
1. 找到最开始缺少定义的结构体定义,在sctp.h中寻找,然后添加进unp.h中,这显然是最简单的做法
2. 放弃unp.h,把需要的头文件自己找齐,放弃依赖一个一了百了的解决方案。
为了适应一下以后不用unp的开发环境,我还是选择了第二条路,首先是找出了源代码用到的unp.h之中的宏定义,添加到了文件开头,然后改掉了源代码中使用的包裹函数,即把大写的Socket等函数改回socket。
完成了这些改动之后果然编译成功了,这件事做起来真的也不算难啊。生成程序时发现sctp_sengmsg等函数没有定义,光有声明,估计是在动态库中,我搜索了/usr/lib文件,果然找到了libsctp.so文件,编译时添加-lsctp之后成功。
然后运行时,出了一个意想不到的问题,我发送过去的消息正确,但是stream的序号不对,服务器回送的消息的stream总是0号。最开始以为是sctp_sengmsg或者sctp_recvmsg中的参数写错了位置,毕竟这个函数接口太多。仔细检查之后却发现没问题。找来随书附带的代码运行却没有问题。打算使用gdb调试却发现忘了怎么用了。。还是得有机会回去仔细学习gdb调试方法啊。。。
然后呢,就在代码之中添加printf函数输出中间的变量结果,最后发现是我把给stream幅值的语句里的’=’写成了’-’号。真是无奈了,这个错误找了两个小时。。。
键盘上的的减号与等于号确实是挨着的,由于代码敲多了之后速度很快,对自己的编码又过于自信,结果出来了一个意想不到的错误。。
以后检查代码需要加上新的检查内容了,检查’=’。