Конференция "Сети" » много подключений с одного сокета
 
  • tippa © (25.04.10 18:47) [0]
    Можно ли для одного сокета вызывать функцию connect несколько раз. Пока получается так, что при повторном вызове connect всегда возвращается ошибка. Создаю сокет, заполняю протокол, порт, адрес, подключаюсь:
    TCP_sock:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    addr.sin_family:=AF_INET;
    addr.sin_port:=htons(port1);
    addr.sin_addr.S_addr := inet_addr(pchar(ip1));
    connect(TCP_sock, @addr, sizeof(addr));


    Затем меняю порт и адрес
    addr.sin_port:=htons(port2);
    addr.sin_addr.S_addr := inet_addr(pchar(ip2));


    и снова подключаюсь
    connect(TCP_sock, @addr, sizeof(addr));


    Если в первый раз подключение прошло удачно - то во второй раз всегда ошибка. Получается, что при каждом новом подключении нужно пересоздавать сокет - как-то некрасиво получается?
  • DVM © (25.04.10 19:05) [1]

    > Получается, что при каждом новом подключении нужно пересоздавать
    > сокет - как-то некрасиво получается?

    нормально.
  • Anatoly Podgoretsky © (25.04.10 19:29) [2]
    > tippa  (25.04.2010 18:47:00)  [0]

    А ты как думал.
  • tippa © (25.04.10 19:44) [3]
    Нас по физике так учили - мол все должно быть красиво. Вот и здесь думаю было бы красивее создать сокет при старте и до конца с ним работать - не сработало)
  • Anatoly Podgoretsky © (25.04.10 20:28) [4]
    > tippa  (25.04.2010 19:44:03)  [3]

    Сработало, только ты пытаешься в один сокет втиснуть несколько.
  • RC (26.04.10 06:30) [5]
    DisconnectEx + TF_REUSE_SOCKET
  • DVM © (26.04.10 11:16) [6]
  • RC (26.04.10 11:47) [7]
    2 DVM

    Там, по ссылке, вроде как какие-то проблемы с ней, которые так и не решили? Я DisconnectEx с TF_REUSE_SOCKET вполне успешно использовал на сервере, есть там кое-какие тонкости, но не смертельные. Выгода от неё на клиенте сомнительна, и я не пробовал, но MSDN прямо утверждает, что DisconnectEx + TF_REUSE_SOCKET можно использовать в паре с ConnectEx, прямо в описании и сказано.
  • bwwebm (27.04.10 13:06) [8]
    А если изменить опцию SO_REUSEADDR сокета:

    var
     bOpt: Bool;
    ...
     bOpt:=True;
     if setsockopt(hSocket, SOL_SOCKET, SO_REUSEADDR, @bOpt, SizeOf(Bool)) <> 0 then begin
       ShowMessage('opt error');
       Exit;
     end;

 
Конференция "Сети" » много подключений с одного сокета
Есть новые Нет новых   [134437   +29][b:0][p:0.001]