[UDT-protocol] udt-m bug report-port resuse side crash
Brought to you by:
lilyco
From: changhao <cha...@ma...> - 2007-02-09 16:02:46
|
i write a udt-m(from cvs) test server and client by UDT::select() as below,and the serverside crashed after sometime and the test work ok for udt3. //==========client========================== #include<winsock2.h> #include <ws2tcpip.h> #include"../udt/cpp/udt.h" #include <cstdlib> #include <iostream> #include <map> #include <set> using namespace std; class UClient; set<UClient*> clis; //new clients CRITICAL_SECTION cts_clis; // void showOpt(UDTSOCKET uSkt) { int optval; int optlen; UDT::getsockopt(uSkt,0,UDT_FC,&optval,&optlen); cout<<"UDT_FC:"<<optval<<"\n"; UDT::getsockopt(uSkt,0,UDT_MSS,&optval,&optlen); cout<<"UDT_MSS:"<<optval<<"\n"; UDT::getsockopt(uSkt,0,UDT_SNDBUF,&optval,&optlen); cout<<"UDT_SNDBUF:"<<optval<<"\n"; UDT::getsockopt(uSkt,0,UDT_RCVBUF,&optval,&optlen); cout<<"UDT_RCVBUF:"<<optval<<"\n"; UDT::getsockopt(uSkt,0,UDP_SNDBUF,&optval,&optlen); cout<<"UDP_SNDBUF:"<<optval<<"\n"; UDT::getsockopt(uSkt,0,UDP_RCVBUF,&optval,&optlen); cout<<"UDP_RCVBUF:"<<optval<<"\n"; } class UClient { public: UDTSOCKET udtSkt; char sdata[10]; char rdata[10]; bool recved; UClient(UDTSOCKET skt) { udtSkt=skt; strcpy(sdata,"test"); bool isBlock=false; UDT::setsockopt(udtSkt,0, UDT_RCVSYN, &isBlock, sizeof(bool)); UDT::setsockopt(udtSkt,0, UDT_SNDSYN, &isBlock, sizeof(bool)); recved=false; } void doSend() { if(recved) { cout<<"UDT::send "<<UDT::send(udtSkt,sdata,5)<<" UDT::send End\n"; recved=false; } // } void doRecv() { cout<<"UDT::recv "<< UDT::recv(udtSkt,sdata,5) <<" UDT::recv End\n"; recved=true; } }; DWORD WINAPI ThreadUdtMsg(LPVOID lpParam) { map<UDTSOCKET,UClient*> skt2cli; UDT::UDSET ruSet,wuSet; timeval tout; tout.tv_sec=1;tout.tv_usec=0; while(true) { EnterCriticalSection(&cts_clis); for(set<UClient*>::iterator cit=clis.begin();cit!=clis.end();cit++) { skt2cli[(*cit)->udtSkt]=*cit; } clis.clear(); LeaveCriticalSection(&cts_clis); if(skt2cli.size()>0) { UD_ZERO(&ruSet); UD_ZERO(&wuSet); for(map<UDTSOCKET,UClient*>::iterator mit=skt2cli.begin();mit!=skt2cli.end();mit++) { UD_SET(mit->first,&ruSet); UD_SET(mit->first,&wuSet); } if(UDT::select(0,&ruSet,&wuSet,NULL,&tout)>0) { for(UDT::UDSET::iterator sit=ruSet.begin();sit!=ruSet.end();sit++) { skt2cli[*sit]->doRecv(); } for(UDT::UDSET::iterator sit=wuSet.begin();sit!=wuSet.end();sit++) { skt2cli[*sit]->doSend(); } } Sleep(1000); } else Sleep(500); } return 0; } void main(void) { SOCKADDR_IN sadd; sadd.sin_family = AF_INET; sadd.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); sadd.sin_port = htons(9000); InitializeCriticalSection(&cts_clis); DWORD dwThreadId; CreateThread(NULL, 0, ThreadUdtMsg,NULL, 0, &dwThreadId); int count=0; while(true) { if(count<100) { UDTSOCKET uSkt=UDT::socket(AF_INET, SOCK_STREAM, 0); int UDT_FC_val=128; UDT::setsockopt(uSkt,0, UDT_FC, &UDT_FC_val, sizeof(int)); int UDT_SNDBUF_val=1024*16; UDT::setsockopt(uSkt,0, UDT_SNDBUF, &UDT_SNDBUF_val, sizeof(int)); int UDT_RCVBUF_val=1024*32; UDT::setsockopt(uSkt,0, UDT_RCVBUF, &UDT_RCVBUF_val, sizeof(int)); int UDP_SNDBUF_val=1024*16; UDT::setsockopt(uSkt,0, UDP_SNDBUF, &UDP_SNDBUF_val, sizeof(int)); int UDP_RCVBUF_val=1024*16; UDT::setsockopt(uSkt,0, UDP_RCVBUF, &UDP_RCVBUF_val, sizeof(int)); if(UDT::ERROR!=UDT::connect(uSkt,(sockaddr *)&sadd,sizeof(SOCKADDR_IN))) { EnterCriticalSection(&cts_clis); clis.insert(new UClient(uSkt)); LeaveCriticalSection(&cts_clis);; count++; cout<<"Num "<<count<<"\n"; //showOpt(uSkt); } Sleep(100); } else Sleep(10000); } } //=========server============================= #include<winsock2.h> #include <ws2tcpip.h> #include"../udt/cpp/udt.h" #include <cstdlib> #include <iostream> #include <set> #include <map> using namespace std; class UClient; set<UClient*> clis; // new clients CRITICAL_SECTION cts_clis; // void showOpt(UDTSOCKET uSkt) { int optval; int optlen; bool boolval; UDT::getsockopt(uSkt,0,UDT_RCVSYN,&boolval,&optlen); cout<<"UDT_RCVSYN:"<<boolval<<"\n"; UDT::getsockopt(uSkt,0,UDT_SNDSYN,&boolval,&optlen); cout<<"UDT_SNDSYN:"<<boolval<<"\n"; UDT::getsockopt(uSkt,0,UDT_FC,&optval,&optlen); cout<<"UDT_FC:"<<optval<<"\n"; UDT::getsockopt(uSkt,0,UDT_MSS,&optval,&optlen); cout<<"UDT_MSS:"<<optval<<"\n"; UDT::getsockopt(uSkt,0,UDT_SNDBUF,&optval,&optlen); cout<<"UDT_SNDBUF:"<<optval<<"\n"; UDT::getsockopt(uSkt,0,UDT_RCVBUF,&optval,&optlen); cout<<"UDT_RCVBUF:"<<optval<<"\n"; UDT::getsockopt(uSkt,0,UDP_SNDBUF,&optval,&optlen); cout<<"UDP_SNDBUF:"<<optval<<"\n"; UDT::getsockopt(uSkt,0,UDP_RCVBUF,&optval,&optlen); cout<<"UDP_RCVBUF:"<<optval<<"\n"; } class UClient { public: UDTSOCKET udtSkt; char sdata[10]; char rdata[10]; bool recved; UClient(UDTSOCKET skt) { udtSkt=skt; strcpy(sdata,"test"); bool isBlock=false; UDT::setsockopt(udtSkt,0, UDT_RCVSYN, &isBlock, sizeof(bool)); UDT::setsockopt(udtSkt,0, UDT_SNDSYN, &isBlock, sizeof(bool)); //showOpt(udtSkt); recved=true; } void doSend() { if(recved) { cout<<"UDT::send "<<UDT::send(udtSkt,sdata,5)<<" UDT::send End\n"; recved=false; } // } void doRecv() { cout<<"UDT::recv "<< UDT::recv(udtSkt,sdata,5) <<" UDT::recv End\n"; recved=true; } }; DWORD WINAPI ThreadUdtMsg(LPVOID lpParam) { map<UDTSOCKET,UClient*> skt2cli; UDT::UDSET ruSet,wuSet; timeval tout; tout.tv_sec=1;tout.tv_usec=0; while(true) { EnterCriticalSection(&cts_clis); for(set<UClient*>::iterator cit=clis.begin();cit!=clis.end();cit++) { skt2cli[(*cit)->udtSkt]=*cit; } clis.clear(); LeaveCriticalSection(&cts_clis); if(skt2cli.size()>0) { UD_ZERO(&ruSet); UD_ZERO(&wuSet); for(map<UDTSOCKET,UClient*>::iterator mit=skt2cli.begin();mit!=skt2cli.end();mit++) { UD_SET(mit->first,&ruSet); UD_SET(mit->first,&wuSet); } if(UDT::select(0,&ruSet,&wuSet,NULL,&tout)>0) { for(UDT::UDSET::iterator sit=ruSet.begin();sit!=ruSet.end();sit++) { skt2cli[*sit]->doRecv(); } for(UDT::UDSET::iterator sit=wuSet.begin();sit!=wuSet.end();sit++) { skt2cli[*sit]->doSend(); } } Sleep(1000); } else Sleep(500); } return 0; } void main(void) { InitializeCriticalSection(&cts_clis); SOCKADDR_IN sadd; SOCKADDR_IN cadd; SOCKADDR_IN aadd; UDTSOCKET tmpUdt; int addlen=sizeof(SOCKADDR_IN); UDTSOCKET uSkt=UDT::socket(AF_INET, SOCK_STREAM, 0); int UDT_FC_val=128; UDT::setsockopt(uSkt,0, UDT_FC, &UDT_FC_val, sizeof(int)); int UDT_SNDBUF_val=1024*16; UDT::setsockopt(uSkt,0, UDT_SNDBUF, &UDT_SNDBUF_val, sizeof(int)); int UDT_RCVBUF_val=1024*32; UDT::setsockopt(uSkt,0, UDT_RCVBUF, &UDT_RCVBUF_val, sizeof(int)); int UDP_SNDBUF_val=1024*16; UDT::setsockopt(uSkt,0, UDP_SNDBUF, &UDP_SNDBUF_val, sizeof(int)); int UDP_RCVBUF_val=1024*16; UDT::setsockopt(uSkt,0, UDP_RCVBUF, &UDP_RCVBUF_val, sizeof(int)); sadd.sin_addr.s_addr = inet_addr("127.0.0.1"); sadd.sin_family = AF_INET; sadd.sin_port = htons(9000); UDT::bind(uSkt,(sockaddr *)&sadd,sizeof(SOCKADDR_IN)); if(UDT::listen(uSkt,50)==UDT::ERROR) { cout << "UDT::listen: " << UDT::getlasterror().getErrorMessage(); exit(0); } DWORD dwThreadId; CreateThread(NULL, 0, ThreadUdtMsg,NULL, 0, &dwThreadId); while(true) if((tmpUdt=UDT::accept(uSkt,(sockaddr *)&cadd,&addlen))!=UDT::INVALID_SOCK) { EnterCriticalSection(&cts_clis); clis.insert(new UClient(tmpUdt)); LeaveCriticalSection(&cts_clis); } } |