我是一位经验丰富的Linux套接字编程人员,并且正在编写一个具有多个传出接口的服务器应用程序。现在服务器套接字与INADDR_ANY一起绑定到进程开始时的随机源端口。如何在Linux中重新绑定udp套接字
稍后在提交响应到特定节点时,我需要分配一个固定的源IP地址。执行此操作的标准方法是调用绑定。但是,端口号会调用一次绑定,连续调用失败,参数错误无效。
创建一个新的socket是不是真的一个很好的选择,因为我将不得不在应对一些客户经常这样做。
我也SO探索和大量的socket选项,如IP_FREEBIND,但它并不完全适合我的方案。
也许使用IP_PKT_INFO和设置源地址可能会奏效,除非它遭受了同样的问题,即不允许一旦与INADDRANY重新绑定到一个固定的源IP后者的插座。
有一种方法解除绑定的现有插座或替代的方式在输出分组设定源IP地址?
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock < 0)
printf("Failed creating socket\n");
struct sockaddr_in addr;
memset(&addr, 0, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(1500);
addr.sin_addr.s_addr = INADDR_ANY;
// first bind succeeds
if ((status = bind(sock, (struct sockaddr *) &addr, sizeof(addr))) < 0)
printf("bind error with port %s\n", strerror(errno));
struct sockaddr_in src_addr;
memset(&src_addr, 0, sizeof(struct sockaddr_in));
src_addr.sin_family = AF_INET;
if (inet_aton("10.0.2.17", &(src_addr.sin_addr)) == 0)
printf("Failed copying address\n");
// second bind fails
if((status = bind(sock, (struct sockaddr *)&src_addr, sizeof(src_addr))) < 0)
printf("re bind error with ip %s\n", strerror(errno));
在这方面的任何想法将不胜感激。我在插座上经历了相当多的材料,等等,但还没有成功。
它不绑定到recvfrom后接收到数据包的接口? – CrazyCasta
如果同一局域网上有多个接口,则为每个NIC创建一个套接字池。更多的细节表示赞赏。 –
谢谢!单独的套接字被用于发送和接收绑定到接口,因为recvfrom没有影响。我实际上也有一个套接字池。但是他们中的任何一个都可能被要求选择一个外部提供的源IP。这是应用程序要求。 – fayyazkl