Приветствую. В общем сабж. Имеется код сервера под винду, ничего примечательного- запрос-ответ (send, recv) проблема в том, что начинаются тормоза на компах где сетевых карт и сетевых подключений больше 1. Можно ли как-нибудь указать проге , посылать\принимать данные только в одну карту? Или может есть какой нибудь другой способ?
Да хоть 10, разници быть не должно если "ничего примечательного- запрос-ответ". route print && ipconfig -all?
Код в сервере клиента следующий. Не пойму, откуда тормоза 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; }
Спасибо Крису за сорц? ) А в каком месте тормоза, при коннекте? По айпи, а не по имени проверял-сравнивал? Код (Text): if (inet_addr(SERVERADDR)!=INADDR_NONE) dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR); else if (hst=gethostbyname(SERVERADDR)) ((unsigned long *)&dest_addr.sin_addr)[0]= ((unsigned long **)hst->h_addr_list)[0][0];