问题1:关于IPPROTO_SCTP的报错
解决方法:在/usr/include/netinet/in.h和/usr/include/netinet/sctp.h中都对IPPROTO_SCTP进行了定义,导致编译报错
将sctp.h中的IPPROTO_SCTP的定义注释掉就好了
#define IPPROTO_SCTP 132
问题2:直接使用gcc server.c -o server编译报错
/tmp/ccuHHXTA.o:在函数‘Sctp_recvmsg’中:
server.c:(.text+0x217):对‘sctp_recvmsg’未定义的引用
/tmp/ccuHHXTA.o:在函数‘Sctp_sendmsg’中:
server.c:(.text+0x291):对‘sctp_sendmsg’未定义的引用
/tmp/ccuHHXTA.o:在函数‘Sctp_bindx’中:
server.c:(.text+0x2d8):对‘sctp_bindx’未定义的引用
/tmp/ccuHHXTA.o:在函数‘sctp_address_to_associd’中:
server.c:(.text+0x40b):对‘sctp_opt_info’未定义的引用
collect2: error: ld returned 1 exit status
解决方法:gcc server.c -L/usr/local/v6/lib -lm -lsctp -o server
问题:3:程序运行时报错
服务器端:getsockopt error: Invalid argument
客户端:sctp_recvmsg error: Transport endpoint is not connected
解决办法:修改sctp_get_no_strms函数(定义在wrapper.c中)
server.c程序中:将
if (sri.sinfo_stream >= sctp_get_no_strms(sockfd,(struct sockaddr*)&clieaddr, len)) {
sri.sinfo_stream = 0; } 修改为:
if (sri.sinfo_stream >= sctp_get_no_strms(sockfd,(struct sockaddr*)&clieaddr, len, sri)) {
sri.sinfo_stream = 0; }
wrapper.c程序中: 将
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)
同时将函数中:
status.sstat_assoc_id = sctp_address_to_associd(sock_fd,to,tolen); 修改为
status.sstat_assoc_id = sri.sinfo_assoc_id;