动态生成clientsocket的问题
typedef struct {
char *pri;
TCustomWinSocket *Socket;
TClientSocket *clientsocket;
char *next;
}
SOCKSTRUCT;
SOCKSTRUCT *head,*curr;
ServerSocket1->Active=true;
int l=sizeof(SOCKSTRUCT);
char *buf,*buf1;
buf=(char *)malloc(l+1);
head=(SOCKSTRUCT *)buf;
curr=head;
head->pri=NULL;
head->next=NULL;
}
void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
SOCKSTRUCT *newsock ;
int l=sizeof(SOCKSTRUCT);
char *buf;
buf=(char *)malloc(l+1);
newsock=(SOCKSTRUCT *)buf;
TClientSocket *clientsocket;
clientsocket=new TClientSocket(NULL);
clientsocket->Host="127.0.0.1";
clientsocket->Port=19001;
clientsocket->ClientType=ctNonBlocking;
clientsocket->OnRead=myclientsocketread;
clientsocket->Active=true;
curr=head;
while(curr->next!=NULL) curr=(SOCKSTRUCT *)curr->next;
newsock->pri=(char *)curr;
newsock->next=NULL;
newsock->Socket=Socket;
newsock->clientsocket=clientsocket;
curr->next=(char *)newsock;
curr=newsock;
AnsiString sql;
sql=Socket->RemoteAddress+":";
sql=sql+(AnsiString)Socket->RemotePort;
Memo1->Lines->Add("Socket add from "+sql);
}
void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
SOCKSTRUCT *pri,*next ;
curr=(SOCKSTRUCT *)head->next;
while(1) {
if(curr->Socket==Socket)
{
curr->clientsocket->Active=false;
pri=(SOCKSTRUCT *)curr->pri;
if(curr->next==NULL) {
pri->next=NULL;
}
else{
pri->next=curr->next;
}
Memo1->Lines->Add("Socket delete");
free(curr);
return;
}
if(curr->next==NULL) return;
curr=(SOCKSTRUCT *)curr->next;
}
}
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
char buff[40000];
int i=Socket->ReceiveLength() ;
Socket->ReceiveBuf(buff,i);
Memo1->Lines->Add("server receive :"+(AnsiString)buff) ;
SOCKSTRUCT *tt;
tt=(SOCKSTRUCT *)head;
while(tt->next!=NULL) {
tt=(SOCKSTRUCT *)tt->next;
if(tt->Socket==Socket) {
Memo1->Lines->Add("now send to htserver :"+(AnsiString)buff+" len="+(AnsiString)i) ;
/*******************************************************************/
/*** 下面必须要这个IF ELSE 要有 ShowMessage否则 不能传送包
***********************************************************/
if(tt->clientsocket->Active==true)
ShowMessage(" true");
else ShowMessage(" false");
int j;
j=tt->clientsocket->Socket->SendBuf(buff,i) ;
}
}
}
void __fastcall TForm1::myclientsocketread(TObject *sender,TCustomWinSocket *socket)
{
TClientSocket *clientsocket;
clientsocket=(TClientSocket *)sender;
char buf[40000];
int len=socket->ReceiveLength();
int j=socket->ReceiveBuf(buf,len);
int k;
Memo1->Lines->Add("on client read:"+(AnsiString)buf);
SOCKSTRUCT *newsock ,*pri,*next ;
int l=sizeof(SOCKSTRUCT);
char *buff;
buff=(char *)malloc(l+1);
newsock=(SOCKSTRUCT *)buff;
curr=(SOCKSTRUCT *)head->next;
while(1) {
if(curr->clientsocket==clientsocket)
{
curr->Socket->SendBuf(buf,len) ;
// curr=(SOCKSTRUCT *)curr->next;
}
if(curr->next==NULL) break;
else
{
curr=(SOCKSTRUCT *)curr->next;
}
}
}