关于服务端监听多端口的棘手有关问题
关于服务端监听多端口的棘手问题
要做个silverlight web的服务端socket程序,客户端会首先请求943端口的安全策略文件,然后才会发后续的服务请求。
现在是我第一次连接了后如果客户端关闭了浏览器后就再也连不上了。
我用了别人的一个类.一直没有找到问题所在,
m_pServerSafePolicy =new CPolicyServerSocket;
if(m_pServerSafePolicy->PolicyStartListening(943)==-1)
OutputDebugString("监听安全策略端口失败!");
else
OutputDebugString("监听安全策略端口成功!");
CPolicyServerSocket::CPolicyServerSocket(void)
{
.......
}
CPolicyServerSocket::~CPolicyServerSocket(void)
{
.........
}
int CPolicyServerSocket::PolicyGetEmptySocket()
{
.........略
return 0;
}
int CPolicyServerSocket::PolicyStopListening()
{
.........略
return 0;
}
int PolicyGetCurrentSocketIndex(LPWSAOVERLAPPED Overlapped)
{
.........略
return 0;
return -1;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
int CPolicyServerSocket::PolicyStartListening(const UINT& port)
{
....省去数行建立socket的常规处理
pPolicyListenThread = AfxBeginThread(PolicyListenThread, this);
pWaitForPolicyCompletionThread = AfxBeginThread(_WaitForPolicyCompletionThread,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL );
return 0;
}
void PolicyReleaseSocket(const int index)
{
closesocket(PolicysockArray[index]);
PolicysockArray[index] = INVALID_SOCKET;
PolicynSockTotal --;
PolicynCurSockIndex = NULLSOCKET;
if(PolicynSockTotal <= 0)
{
pWaitForPolicyCompletionThread->SuspendThread();
}
}
UINT PolicyListenThread(LPVOID lParam)
{
CPolicyServerSocket* PolicypServer = (CPolicyServerSocket*)lParam;
SOCKADDR_IN ClientAddr;
int addr_length=sizeof(ClientAddr);
while(TRUE)
{
SOCKET sockTemp = accept( PolicysockListen,(SOCKADDR*)&ClientAddr,&addr_length);
if(sockTemp == INVALID_SOCKET)
{
AfxMessageBox("Accept Connection failed!");
continue;
}
PolicynSockIndex = PolicypServer->PolicyGetEmptySocket();
PolicysockArray[PolicynSockIndex] = sockTemp;
PolicynSockTotal++;
PolicybNewSocket = TRUE;
if(PolicynSockTotal >= 1)
pWaitForPolicyCompletionThread->ResumeThread();
}
return 0;
}
void CALLBACK _PolicyCompletionRoutine(DWORD Error,
DWORD BytesTransfered,
LPWSAOVERLAPPED Overlapped,
DWORD inFlags)
{
TRACE("PolicyCompletionRoutine......");
PolicynCurSockIndex = PolicyGetCurrentSocketIndex(Overlapped);
if(Error != 0 || BytesTransfered == 0)
{
PolicyReleaseSocket(PolicynCurSockIndex);
return;
}
CString strtemp="";
strtemp=PolicyDataBuf[PolicynCurSockIndex].buf;
OutputDebugString(strtemp);
if(strcmp(strtemp.GetBuffer(0),"<policy-file-request/>")==0)
{
char SaftPolicy[512]={0};
sprintf(SaftPolicy,"%s",Send_SafePolicy);
SendResponseMsg(SaftPolicy,PolicysockArray[PolicynCurSockIndex]);
return;
}
return;
}
UINT _WaitForPolicyCompletionThread(LPVOID lParam)
{
PolicyEventArray[0] = WSACreateEvent();
DWORD dwRecvBytes = 0, Flags = 0;
while(TRUE)
{
if(PolicybNewSocket)
要做个silverlight web的服务端socket程序,客户端会首先请求943端口的安全策略文件,然后才会发后续的服务请求。
现在是我第一次连接了后如果客户端关闭了浏览器后就再也连不上了。
我用了别人的一个类.一直没有找到问题所在,
m_pServerSafePolicy =new CPolicyServerSocket;
if(m_pServerSafePolicy->PolicyStartListening(943)==-1)
OutputDebugString("监听安全策略端口失败!");
else
OutputDebugString("监听安全策略端口成功!");
CPolicyServerSocket::CPolicyServerSocket(void)
{
.......
}
CPolicyServerSocket::~CPolicyServerSocket(void)
{
.........
}
int CPolicyServerSocket::PolicyGetEmptySocket()
{
.........略
return 0;
}
int CPolicyServerSocket::PolicyStopListening()
{
.........略
return 0;
}
int PolicyGetCurrentSocketIndex(LPWSAOVERLAPPED Overlapped)
{
.........略
return 0;
return -1;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
int CPolicyServerSocket::PolicyStartListening(const UINT& port)
{
....省去数行建立socket的常规处理
pPolicyListenThread = AfxBeginThread(PolicyListenThread, this);
pWaitForPolicyCompletionThread = AfxBeginThread(_WaitForPolicyCompletionThread,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL );
return 0;
}
void PolicyReleaseSocket(const int index)
{
closesocket(PolicysockArray[index]);
PolicysockArray[index] = INVALID_SOCKET;
PolicynSockTotal --;
PolicynCurSockIndex = NULLSOCKET;
if(PolicynSockTotal <= 0)
{
pWaitForPolicyCompletionThread->SuspendThread();
}
}
UINT PolicyListenThread(LPVOID lParam)
{
CPolicyServerSocket* PolicypServer = (CPolicyServerSocket*)lParam;
SOCKADDR_IN ClientAddr;
int addr_length=sizeof(ClientAddr);
while(TRUE)
{
SOCKET sockTemp = accept( PolicysockListen,(SOCKADDR*)&ClientAddr,&addr_length);
if(sockTemp == INVALID_SOCKET)
{
AfxMessageBox("Accept Connection failed!");
continue;
}
PolicynSockIndex = PolicypServer->PolicyGetEmptySocket();
PolicysockArray[PolicynSockIndex] = sockTemp;
PolicynSockTotal++;
PolicybNewSocket = TRUE;
if(PolicynSockTotal >= 1)
pWaitForPolicyCompletionThread->ResumeThread();
}
return 0;
}
void CALLBACK _PolicyCompletionRoutine(DWORD Error,
DWORD BytesTransfered,
LPWSAOVERLAPPED Overlapped,
DWORD inFlags)
{
TRACE("PolicyCompletionRoutine......");
PolicynCurSockIndex = PolicyGetCurrentSocketIndex(Overlapped);
if(Error != 0 || BytesTransfered == 0)
{
PolicyReleaseSocket(PolicynCurSockIndex);
return;
}
CString strtemp="";
strtemp=PolicyDataBuf[PolicynCurSockIndex].buf;
OutputDebugString(strtemp);
if(strcmp(strtemp.GetBuffer(0),"<policy-file-request/>")==0)
{
char SaftPolicy[512]={0};
sprintf(SaftPolicy,"%s",Send_SafePolicy);
SendResponseMsg(SaftPolicy,PolicysockArray[PolicynCurSockIndex]);
return;
}
return;
}
UINT _WaitForPolicyCompletionThread(LPVOID lParam)
{
PolicyEventArray[0] = WSACreateEvent();
DWORD dwRecvBytes = 0, Flags = 0;
while(TRUE)
{
if(PolicybNewSocket)