是否可以关闭旧的服务器ip连接并将其连接到使用C的客户端套接字程序中的新服务器ip ?我的客户端程序通过SCTP连接与服务器连接,并在某些情况下,我想从旧服务器断开连接并连接到新服务器,而不打开新的套接字?客户端代码:
connSock = socket (AF_INET, SOCK_STREAM, IPPROTO_SCTP);
if (connSock == -1)
{
perror("socket()");
exit(1);
}
struct sctp_paddrparams params;
len = sizeof(params);
memset(¶ms, 0, sizeof(params));
if (getsockopt(connSock, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, ¶ms, &len)) {
perror("getsockopt");
exit(1);
}
// set client address
struct sockaddr_in localaddr;
localaddr.sin_family = AF_INET;
char* client_ip = get_our_ip();
localaddr.sin_addr.s_addr = inet_addr(client_ip) ;
localaddr.sin_port = 0;
bind(connSock, (struct sockaddr *)&localaddr, sizeof(localaddr));
// set server address
bzero ((void *) &servaddr, sizeof (servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons (port);
servaddr.sin_addr.s_addr = inet_addr(server_ip);
ret = connect(connSock, (struct sockaddr *) &servaddr, sizeof (servaddr));
if (ret == -1)
{
perror("connect()");
close(connSock);
exit(1);
}
if(due_to_some_condition_got_new_server_ip){
------------------------------> I have new server_ip2 to connect
}
这是不可能的。
打开一个新的套接字。
即使有可能,它也不会比打开一个新的套接字快。连接套接字的缓慢部分是,您的计算机必须向另一台计算机发送数据包并获得回复。无论您连接的是相同的套接字还是不同的套接字,都会发生这种情况。
带有一对一风格的界面(使用SOCK_STREAM
,因为你是),它是不可能重用一个套接字,没有。套接字仅与一个连接相关联,并且该连接不能更改。要连接到一个新的服务器IP,你必须关闭旧的套接字,connect()
一个新的套接字。
带有一对多样式的接口(使用SOCK_SEQPACKET
),可以重用套接字,因为您根本不会使用connect()
,只是sendmsg()
和recvmsg()
。因此,您只需在每个消息的基础上sendmsg()
到所需的服务器IP。您可以使用setsockopt()
来启用SCTP_AUTOCLOSE
选项,以关闭您不再使用的空闲连接。
阅读man文档获取更多详细信息:https://linux.die.net/man/7/sctp