SOCKET aSocket[1024];
int SocketCount=0;
while(true)
{
....//create and bind m_hSocket
ret=listen(m_hSocket,2);
aSocket[SocketCount]=accept(m_hSocket,NULL,NULL);
SocketCount++;
if(ret==SOCKET_ERROR) continue
else
{
while(true)
{
char buff[1024];
ret=recv(aSocket[SocketCount-1],buff,128,0);
....
}
}
如果accept一个socket以后,m_hSocket是不是还在监听?
另:我这是想把这些放在一个线程中,使这个线程能做为socket的服务端,监听端口,对
每个连到服务端的请求,实现先到先处理,不能马上处理的先保存的套接字到aSocket中,
,等前面的处理完再对其进行处理。
各位高手帮帮忙,很急的说。谢谢谢谢!!!
1、常规的办法是先创建一个daemon线程,专门用于监听,来一个accept一个,如果计数没有超过限你设定的限额的话。每创建一个socket,又为它创建一个thread,专门管理这个socket上的通讯,通讯结束时closesocket,线程结束;或者埋伏若干线程,有socket要处理时,选一个出来干活,没活儿都歇着。
2、以上socket与thread一对一的方法,只适用于要管理的socket不多的时候,要是你有上百个socket,最好别这么干了,因为有太多的线程切换。这时候应该采用轮循的办法。一个thread管理若干个socket.我有个模糊的印象,select族函数好象只能对付64个以内的socket对象,超过64应该使用多个thread,一人分一点儿。对了,《WINDOWS网络编程技术》里面有讲,但不多。
3、NO.1的办法相信大家都在用,NO.2可能就没有多少人见识过了。我也一样,只知道有这么回事,没有真的用过。
希望有高人站出来,指点一二。
这样的情况其实是最常见的,以下是我的一个程序里用到的
贴出来仅供参考:)
UINT HttpProxy(LPVOID pParam)
{
.................//define the member and accept the pParam
//go....
//create
MainSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(MainSocket == SOCKET_ERROR)
{
ParseError(ProxyDlg, "端口创建错误");
return -2;
}
Host.sin_family = AF_INET;
Host.sin_port = htons(port);
Host.sin_addr.s_addr = inet_addr(addr);
//bind
if(bind(MainSocket, (SOCKADDR *)&Host, sizeof(Host)) != 0)
{
ParseError(ProxyDlg, "HttpProxy: 绑定错误");
return -3;
}
//listen
if(listen(MainSocket,5) == SOCKET_ERROR)
{
ParseError(ProxyDlg, "HttpProxy: 监听错误");
return -4;
}
AddLen = sizeof(Client);
wsprintf(status, "HttpProxy: 代理服务器正常运行中...");
ParseStatus(ProxyDlg, status);
i = 0;
///
fd_set fds;
TIMEVAL timeout;
int nError;
/////////////////////////////////////
wsprintf(status,"HttpProxy: wait request...");
ParseStatus(ProxyDlg, status);
//wait request from client
do
{
//time out
timeout.tv_sec = 2;
timeout.tv_usec = 0;
// we use select to avoid blocking on accept forever.
// it
FD_ZERO(&fds);
FD_SET(MainSocket, &fds); //MainSocket+1 ???
nError = select(MainSocket, &fds, NULL, NULL, &timeout);
if(nError==WSAEINTR)
{
ParseError(ProxyDlg, "WSAEINTR");
continue; //interrupted: no harm done
}
else if(nError<0)
{ParseError(ProxyDlg, "nError");
return 0; //error
}
if(FD_ISSET(MainSocket, &fds)==0)
{
//ParseError(ProxyDlg, "HttpProxy: timeout");
continue;
}
//accept it
ClientSocket = accept(MainSocket, (SOCKADDR *)&Client, &AddLen);
if(ClientSocket == SOCKET_ERROR)
{
ParseError(ProxyDlg, "HttpProxy: 接受客户请求错误");
continue;
}
wsprintf(status,"beginthread...");
ParseStatus(ProxyDlg, status);
i ++ ;
if( i >= 1000)
i = 0;
Global[i] = ClientSocket;
//set the thread parameter
memset(&threadRequest, 0, sizeof(threadRequest));
threadRequest.ProxyDlg = threadProxy->ProxyDlg;
threadRequest.pSocket = (void*)&Global[i];
//all ready, we create thread to process the request of the client
//you can use it to instead your while loop
AfxBeginThread(HttpRequest, &threadRequest);
// ::Sleep(100);
}while(threadProxy->bInThread);
wsprintf(status, "CloseSocket");
ParseStatus(ProxyDlg, status);
closesocket(MainSocket);
return 0;
}