我一直在使用C开发这个简单的客户端 - 服务器应用程序,其中客户端只是将随机数据发送到服务器,服务器只是监听客户端发送的内容.我正在使用的协议是SCTP,我对如何实现多宿主功能很感兴趣.
我一直在互联网上搜索有关SCTP和多宿主的信息,并且无法找到有关如何指示SCTP使用多个地址进行通信的任何示例.我只是设法找到在尝试使用多宿主设置SCTP时应该使用的命令,它应该非常简单.
我创建了一个客户端和一个服务器,它们都使用我的计算机两个WLAN接口作为它们的连接点.两个适配器都连接到同一个AP.服务器正在从这些接口侦听来自客户端的数据,客户端通过它们发送数据.问题是,当我断开客户端正在发送数据的主WLAN适配器时,传输只会在它应该回退到辅助连接时停止.我用Wireshark跟踪了数据包,第一个INIT和INIT_ACK数据包报告客户端和服务器都使用WLAN适配器作为通信链路.
当我重新连接主WLAN连接时,传输会在一段时间后继续传输并向服务器发送大量数据包,这是不对的.数据包应该通过辅助连接传输.在许多网站上,据说SCTP在连接之间自动切换,但在我的情况下,没有发生.所以你们有什么线索,为什么当主链路断开时传输不会回退到辅助连接,即使客户端和服务器知道其他地址包括辅助地址?
关于服务器:
服务器创建SOCK_SEQPACKET类型套接字并绑定使用INADDR_ANY找到的所有接口.getladdrs报告服务器被限制为3个地址(包括127.0.0.1).之后,服务器侦听套接字并等待客户端发送数据.服务器使用sctp_recvmsg调用读取数据.
关于客户:
客户端还创建一个SEQPACKET套接字并连接到命令行参数指定的IP地址.在这种情况下,getladdrs还返回3个地址,如服务器情况.之后,客户端开始向服务器发送数据,延迟一秒钟到服务器,直到用户使用Ctrl-C中断发送.
这是一些源代码:
服务器:
#define BUFFER_SIZE (1 << 16)
#define PORT 10000
int sock, ret, flags;
int i;
int addr_count = 0;
char buffer[BUFFER_SIZE];
socklen_t from_len;
struct sockaddr_in addr;
struct sockaddr_in *laddr[10];
struct sockaddr_in *paddrs[10];
struct sctp_sndrcvinfo sinfo;
struct sctp_event_subscribe event;
struct sctp_prim prim_addr;
struct sctp_paddrparams heartbeat;
struct sigaction sig_handler;
void handle_signal(int signum);
int main(void)
{
if((sock = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP)) < 0)
perror("socket");
memset(&addr, 0, sizeof(struct sockaddr_in));
memset((void*)&event, 1, sizeof(struct sctp_event_subscribe)); …Run Code Online (Sandbox Code Playgroud)