大家好,我现在在写一个端口转发程序,转发数据到web服务器,相当于中转了一下数据,需要用一个socket池提高效率,但是除了问题,我在连接完服务器后同时监听了该socket的事件WSAAsyncSelect ,我测试时刚打开网页还可以 但一会 这个服务器socket就退出了,处理函数里我是判断当socket断开时重新连接的 不知为什么会断开 在单个线程里进行数据收发处理时报183错误,当文件已存在时,无法创建该文件 不太明白 请大侠们 帮帮忙
调试欢乐多
{创建socket池备用
SOCKET ServerSocket=-1;
if (serverSocketList.size()==0)
{
serverSocketStruct socketStruct;
for(int i=0;i<MAX_THREAD;i++)
{
ServerSocket=ConnectHost();这是连接服务器的函数,返回socket
socketStruct.server=ServerSocket;
socketStruct.used=false;
serverSocketList.push_back(socketStruct);
WSAAsyncSelect(ServerSocket,pDlgConfig->m_hWnd,WM_WEBSERVER_CLOSE,FD_CLOSE);监听socket的退出事件
}
}
}、、线程里调用的函数,得到空闲连接 用户数据转发
SOCKET CThreadPoolManage::GetServerSocket(int &serverSocketIndex)
{
while(waitingSection.Lock(10000)==0);
SOCKET ServerSocket=-1;
for(int j=0;j<serverSocketList.size();j++)
{
if (!serverSocketList[j].used)
{
serverSocketIndex=j;
ServerSocket= serverSocketList[j].server;
serverSocketList[j].used=true;
break;
}
}
waitingSection.Unlock();
return ServerSocket;
}nt WorkerThread::PortTransfer()
{
SOCKET ServerSock;
//先连接到目标计算机的服务
ServerSock =threadPool->GetServerSocket(this->socketIndex);
// ServerSock=threadPool->ConnectHost();
socket池这样做的,一开始先创建若干个,并置为闲 当有客户请求时就取出来,并置为忙,当socket收到FD_CLOSE消息时就重新连接下放入 socket池如果我在这个线程函数里 直接调用ServerSock=threadPool->ConnectHost();的话 而不是从socket池就不会有问题。