Comment faire pour re lier un socket udp dans Linux

Je suis un Linux expérimentés en prise de programmeur et suis en train d'écrire une application serveur qui a de nombreuses interfaces sortantes. Maintenant socket serveur se lie à un port aléatoire source dans le début du processus avec INADDR_ANY.

Plus tard, à un certain moment lors de la présentation de la réponse à un nœud spécifique, j'ai besoin d'attribuer un fixe adresse ip source. Le standard de la façon de le faire est d'appeler bind. Cependant, la liaison est appelée une fois pour le numéro de port, les appels successifs échouer avec l'argument non valide erreur.

La création d'un nouveau socket n'est pas vraiment un bon choix étant donné que je vais avoir à le faire très souvent à répondre à certains clients.

J'ai également exploré et une SORTE de beaucoup d'options de prise, comme IP_FREEBIND, mais ce n'est pas tout de suite de mon scénario.

Peut-être en utilisant IP_PKT_INFO et le réglage de l'adresse de la source peut fonctionner à moins qu'il souffre du même problème c'est à dire ne permettant pas une prise une fois lié à INADDRANY à relier à une source fixe ip-ci.

Est-il un moyen de séparer un socket existant ou un autre moyen de réglage de la source de l'adresse ip dans les paquets?

    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));

Toutes les idées à cet égard sera très appréciée. Je suis passé par de nombreux documents sur les sockets, DONC etc. mais sans succès encore.

N'est-il pas se lier à l'interface qui a reçu le paquet après recvfrom?
S'il y a plusieurs interfaces sur le même réseau local, puis créer un socket piscine, un pour chaque carte réseau. Un peu plus en détail est apprécié.
Merci!!!! Prises séparées sont utilisées pour l'envoi et la réception afin de liaison à l'interface de la suite de recvfrom n'a pas d'impact. Et j'ai fait une prise de la piscine aussi. Mais encore l'un d'eux pourrait être nécessaire de choisir un externe fourni ip source. C'est la condition d'application.
encore un d'entre eux pourrait être nécessaire de choisir un externe fourni ip source." Vous dites que vous avez besoin pour gérer les adresses ip source, autres que ceux déjà associés à des interfaces réseau?
Non, c'est un de ceux sur les interfaces. La raison que j'ai mentionné "fournis par l'extérieur", c'est que une liste de configuration est spécifié dans le formulaire d'ip de destination: adresse ip source. Si le courant sortant de destination du paquet est l'une des ip de destination, nous choisissons le source correspondant ip de la liste et l'utiliser comme la prise de la source. Sinon, nous utilisons SOBINDTODEVICE pour l'attacher à un pré configuré l'interface et de l'envoyer.

OriginalL'auteur fayyazkl | 2012-10-03