我是一位经验丰富的 Linux 套接字程序员,正在编写一个具有许多传出接口的服务器应用程序。现在服务器套接字与 INADDR_ANY 一起在进程开始时绑定到一个随机源端口。
稍后在向特定节点提交响应时,我需要分配一个固定的源 IP 地址。执行此操作的标准方法是调用 bind。但是,为端口号调用一次绑定,连续调用失败并出现无效参数错误。
创建一个新的套接字并不是一个好的选择,因为我必须经常在响应某些客户时这样做。
我还探索了 SO 和许多套接字选项,例如 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));
在这方面的任何想法都将受到高度赞赏。我已经阅读了大量关于套接字、SO 等的材料,但还没有成功。