void __fastcall TListenThread::BindListenSocket()
{
if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
DoError();
return;
}
}
void __fastcall TListenThread::ListenSocket()
{
if(listen(m_Socket,SOMAXCONN)){
sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
DoError();
return;
}
//Determine whether there is any connection
FD_ZERO(&FDS);
FD_SET(m_Socket,&FDS);
}
void __fastcall TListenThread::Execute()
{
char buf[4096];
struct sockaddr_in from; //for UDP
int nLen=sizeof(from),nSize=0; //for UDP
InitSocket();
CreateListenSocket();
SetListenSocket();
BindListenSocket();
if(m_Protocol==UDP){
while(!Terminated){
int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);
if(nSize>0){
buf[nSize]='\0';
PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
::Sleep(100);
sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));
}
else return;
}
}
ListenSocket();
struct sockaddr_in client;
int nLength=sizeof(struct sockaddr_in);
while(!Terminated){
int nError=select(1,&FDS,0,0,0);
if(nError<=0) Terminate();
SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
if(m_AcceptSocket==INVALID_SOCKET){
sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
DoError();
Terminate();
return;
}