如何在C中重新连接客户端到不同的服务器ip而不打开新的套接字



是否可以关闭旧的服务器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(&params, 0, sizeof(params));
if (getsockopt(connSock, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, &params, &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

相关内容

  • 没有找到相关文章

最新更新