Новичок
Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.10.2008
Репутация: нет Всего: нет
|
Прошу помочь с UDP в сокс кто может. Вообщем написал сервер.Метод Connect работает,а вот c UDP что-то не ладно((. По TCP принимается запрос от клиента, отсылается ответ и далее идёт обмен по UDP. Даже данные от клиента к конечному серверу отсылаются и наоборот, но клиент как-будто не воспринимает пришедшие к нему данные. Тестировал при помощи cs1.6 и соксификатора permeo.Вот часть кода, где начинается непрсредственно обмен по UDP: Код | setsockopt(sock,IPPROTO_TCP,TCP_NODELAY,(char*)&optval,sizeof(bool)); while(true){ FD_ZERO(&fdset); FD_SET(UDPClient,&fdset); FD_SET(UDPServer,&fdset); FD_SET(sock,&fdset); if (select(0,&fdset,NULL,NULL,NULL) < 0 ) break; if (FD_ISSET(sock,&fdset)){ ret=recv(sock,Buff,sizeof(Buff),0); if (ret<=0){ cout << "UDP session closed" << endl; return 0; } else cout << "UDP session start" << endl<<"UDPsock: "<<Buff<<endl; continue; } if (FD_ISSET(UDPClient,&fdset)){ ZeroMemory(&Buff,sizeof(Buff)); i=sizeof(bndclient); ret=recvfrom(UDPClient,Buff,sizeof(Buff),0,(sockaddr*)&bndclient,&i); if (ret<=0) break; if (Buff[2]==0) cout << "Polnii packet"<<endl; else {cout<<"Fragment"<<endl; continue;} switch (Buff[3]){ case 0x01: w1=MAKEWORD(Buff[4],Buff[5]); w2=MAKEWORD(Buff[6],Buff[7]); IP2=MAKELONG(w1,w2); int port1; port1=MAKEWORD(Buff[8],Buff[9]); for (i=0;i<ret;i++) Buff[i]=Buff[i+10]; ret-=10; ZeroMemory(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_addr.s_addr=IP2; servaddr.sin_port=port1; cout <<"IP v4: "<< inet_ntoa(servaddr.sin_addr) <<" port: "<<htons(port1)<<endl; break; case 0x03: cout <<"Domain name"<< endl; } ret=sendto(UDPServer,Buff,ret,0,(sockaddr*)&servaddr,sizeof(servaddr)); if (ret==SOCKET_ERROR) MessageBoxA(0,"UDP_ToServ","Error",0); cout << "UDPClientToServ: " << Buff<<" size: "<< ret << endl; continue; } if (FD_ISSET(UDPServer,&fdset)){ i=sizeof(servaddr); ret=recvfrom(UDPServer,Buff,sizeof(Buff),0,(sockaddr*)&servaddr,&i); if (ret<=0) break; for (i=ret-1;i>=0;i--) Buff[i+10]=Buff[i]; w1=HIWORD(IP); w2=LOWORD(IP); Buff[0]=0x00; Buff[1]=0x00; Buff[2]=0x00; Buff[3]=0x01; *((unsigned long*)(Buff+4))=bndclient.sin_addr.s_addr; *((unsigned short*)(Buff+8))=bndclient.sin_port; ret=sendto(UDPClient,Buff,ret+10,0,(sockaddr*)&bndclient,sizeof(bndclient)); cout << "UDPServerToClient: " <<"size: "<<ret<<" Addr: "<< inet_ntoa(bndclient.sin_addr)<<" Port "<<htons(bndclient.sin_port)<<endl; continue; } }
|
|