不同Ip 绑定同一端口 ,设置过SO_REUSEADDR选项 仍然出现address already in use 异常,求教大神指点,新人做服务器开发

不同Ip 绑定同一端口 ,设置过SO_REUSEADDR选项 仍然出现address already in use 错误,求教大神指点,新人做服务器开发
本文用四个线程绑定四个Ip到同一端口,调用过set_sock_opt();仍然有错误,只能启动第一个,后面三个错误,通过netstat命令发现此端口ip为0.0.0.0   ,通过打印信息发现我的ip确实传进去了,而且我只运行一个ip测试,绑定是成功的,服务器启动了,可以正常和客户端通讯,求教高人指点,谢谢了,新手做服务器开发。
#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/wait.h>
#include <errno.h>
#include <fcntl.h>

using namespace std;不同Ip 绑定同一端口 ,设置过SO_REUSEADDR选项 仍然出现address already in use 异常,求教大神指点,新人做服务器开发

#define NUM_THREADS 4

const char* ip_table[] = {"192.168.26.132","192.168.1.10","192.168.1.12","127.0.0.1"};
void* thread_function(void* servip)
{
    struct sockaddr_in servaddr,remote;
    int request_sock,nsock;
    int fd_num;
    int maxfd,fd;
    int ret;
    uint32_t addlen;
    fd_set set,reset;
    struct timeval timeout;
    int opt = 1;
    char buf[128] = {'\0'};
    
    request_sock = socket(AF_INET,SOCK_STREAM,0);
    if(request_sock < 0)
    {
        perror("socket");
        return NULL;
    }

    /*enable address reuse*/
    ret = setsockopt(request_sock,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
    if(0 != ret)
    {
        perror("setsockopt:");
        return NULL;
    }

    /*bind request_sock to corresponding net devicename*/
   /* ret = setsockopt(request_sock,SOL_SOCKET,SO_BANDTODEVICE,"eth0:0");
    if(ret)
    {
        printf("setsockopt SO_BANDTODEVICE failed:");
    }*/

    memset(&servaddr,0,sizeof(struct sockaddr_in));
    servaddr.sin_family = AF_INET;
    printf("ip=%s\n",(char*)servip);
    inet_pton(request_sock,(char*)servip,&servaddr.sin_addr.s_addr);
    servaddr.sin_port = htons(20000);

    ret = bind(request_sock,(struct sockaddr*)&servaddr,sizeof(struct sockaddr_in));
    if(ret < 0)
    {
        perror("bind");
        return NULL;
    }


    ret = listen(request_sock,4);
    if(ret < 0)
    {
        perror("listen");
        return NULL;
    }


    FD_ZERO(&set);
    FD_SET(request_sock,&set);
    maxfd = request_sock;

    while(1)
    {
        reset = set;
        timeout.tv_sec = 0;
        timeout.tv_usec = 1000000;
        
        fd_num = select(maxfd+1,&reset,(fd_set*)0,(fd_set*)0,&timeout);
        if(fd_num < 0)
        {
            perror("select");
            return NULL;
        }
        else if(0 == fd_num)
        {
            printf(".");
            fflush(stdout);
            continue;
        }

        if(FD_ISSET(request_sock,&reset))
        {
            addlen = sizeof(struct sockaddr_in);
            nsock = accept(request_sock,(struct sockaddr*)&remote,&addlen);