[UDT-protocol] udt-m bug report-port resuse side crash
Brought to you by:
lilyco
|
From: changhao <cha...@ma...> - 2007-02-09 16:13:29
|
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);
}
}
|