Тормоза проги, когда сетевых карт больше одной

Тема в разделе "WASM.NETWORKS", создана пользователем Rustem, 29 июл 2008.

  1. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Приветствую.
    В общем сабж. Имеется код сервера под винду, ничего примечательного- запрос-ответ
    (send, recv)
    проблема в том, что начинаются тормоза на компах где сетевых карт и сетевых подключений больше 1.

    Можно ли как-нибудь указать проге , посылать\принимать данные только в одну карту?
    Или может есть какой нибудь другой способ?
     
  2. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Да хоть 10, разници быть не должно если "ничего примечательного- запрос-ответ".
    route print && ipconfig -all?
     
  3. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Код в сервере клиента следующий. Не пойму, откуда тормоза

    DWORD WINAPI ClientThread(LPVOID param)
    {
    char buff[1024];
    printf("TCP DEMO CLIENT\n");
    // 1. Winsock
    if (WSAStartup(0x202,(WSADATA *)&buff[0]))
    {
    printf("WSAStart error %d\n",WSAGetLastError());
    return -1;
    }
    // Øàã 2 . ñîçäàíèå ñîêåòà
    SOCKET my_sock;
    my_sock=socket(AF_INET,SOCK_STREAM,0);
    if (my_sock<0)
    {
    printf("Socket() error %d\n",WSAGetLastError());
    return -1;
    }
    // Øàã 3 . óñòàíîâêà ñîåäèíåíèÿ
    // çàïîëíåíèå ñòðóêòóðû sockaddr_in – óêàçàíèå àäðåñà è ïîðòà ñåðâåðà
    sockaddr_in dest_addr;
    dest_addr.sin_family=AF_INET;
    dest_addr.sin_port=htons(MY_PORT);
    HOSTENT *hst;
    // ïðåîáðàçîâàíèå IP àäðåñà èç ñèìâîëüíîãî â ñåòåâîé ôîðìàò
    if (inet_addr(SERVERADDR)!=INADDR_NONE)
    dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
    else
    // ïîïûòêà ïîëó÷èòü IP àäðåñ ïî äîìåííîìó èìåíè ñåðâåðà
    if (hst=gethostbyname(SERVERADDR))
    // hst->h_addr_list ñîäåðæèò íå ìàññèâ àäðåñîâ,
    // à ìàññèâ óêàçàòåëåé íà àäðåñà
    ((unsigned long *)&dest_addr.sin_addr)[0]=
    ((unsigned long **)hst->h_addr_list)[0][0];
    else
    {
    printf("Invalid address %s\n",SERVERADDR);
    closesocket(my_sock);
    WSACleanup();
    return -1;
    }
    // àäðåñ ñåðâåðà ïîëó÷åí – ïûòàåìñÿ óñòàíîâèòü ñîåäèíåíèå
    if (connect(my_sock,(sockaddr *)&dest_addr,sizeof(dest_addr)))
    {
    printf("Connect error %d\n",WSAGetLastError());
    return -1;
    }
    printf("Connection with %s success\nType quit for quit\n\n",SERVERADDR);
    // Øàã 4 . ÷òåíèå è ïåðåäà÷à ñîîáùåíèé
    int nsize;
    while((nsize=recv(my_sock,&buff[0],sizeof(buff),0))!=SOCKET_ERROR)
    {
    SEND_FMT *pSnd;
    pSnd=(SEND_FMT *)buff;
    switch(pSnd->cmd)
    {
    case 0: pSnd->param=(int)DoSmth(); break;
    case 1: pSnd->param=2; break;
    case 2: pSnd->param=(int)DoSmth2(pSnd->param);break;
    }
    send(my_sock,&buff[0],sizeof(SEND_FMT),0);
    }
    closesocket(my_sock);
    WSACleanup();
    return -1;
    }
     
  4. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Спасибо Крису за сорц? )


    А в каком месте тормоза, при коннекте?
    По айпи, а не по имени проверял-сравнивал?
    Код (Text):
    1. if (inet_addr(SERVERADDR)!=INADDR_NONE)
    2. dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
    3. else
    4. if (hst=gethostbyname(SERVERADDR))
    5. ((unsigned long *)&dest_addr.sin_addr)[0]=
    6. ((unsigned long **)hst->h_addr_list)[0][0];
     
  5. lilkiddd

    lilkiddd New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2008
    Сообщения:
    7
    Rustem, попробуй прибиндить сокет, который listen, к какому-нибудь одному адресу.