我的情况是客户端需要连接到多个服务器。根据这里回答的问题: Connecting to multiple servers from a single client socket C
我需要创建一个单独的套接字来连接每个服务器。我想问的是:除了重复这段代码创建多个套接字之外,还有更有效的方法吗?非常感谢!
//Create a socket for the client
//If sockfd<0 there was an error in the creation of the socket
if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) <0) {
perror("Problem in creating the socket");
exit(2);
}
//Creation of the socket
memset(&client1addr, 0, sizeof(client1addr));
client1addr.sin_family = AF_INET;
client1addr.sin_addr.s_addr= inet_addr(argv[1]);
client1addr.sin_port = htons(SERV_PORT); //convert to big-endian order
//Connection of the client to the socket
if (connect(sockfd, (struct sockaddr *) &client1addr, sizeof(client1addr))<0) {
perror("Problem in connecting to the server");
exit(3);
}
答案 0 :(得分:0)
尝试为不同的连接重用相同的套接字的基本问题是套接字连接不仅必须存储连接的本地部分(主机和端口号),还必须存储远程连接(远程主机和远程端口)。此信息的目的是在某些数据包到达主机时到达正确的套接字,必须仅根据数据包内容选择正确的套接字而不是其他内容。因此,只有一个套接字不能尝试将同一个套接字连接到不同的远程位置。通常这里的问题是你认为套接字是理想的东西,可能是我们的需求,而不是必须遵守协议规则的东西。连接的套接字必须定义这四个数量并且一旦分配(这意味着一旦连接),就不能使它重叠更多的连接。
顺便说一句,套接字创建是经过优化的,因此在资源方面获取新套接字的成本很低。
如果即使这个解决方案不能负担得起,你也有可能切换到无连接协议(如udp),一旦你将套接字绑定到主机地址和客户端端口就准备好接收数据包,所以它可以接收任何指向该IP地址和端口的数据包。这样,您可以仅使用套接字管理来自不同源的数据(例如,这已在许多p2p协议中使用),但您必须自己处理丢弃,重复和更改的传输数据包。