accept()函数为什么不阻塞?
BOOL WSocket::CreateServer(int port, int backlog,LPCSTR IP)
{
if(m_bListened == TRUE) CloseServer();
struct sockaddr_in local;
LPHOSTENT lpHost;
//创建监听socket
m_sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if(m_sServer == SOCKET_ERROR)
{
err = WSAGetLastError();
return FALSE;
}
m_hostIp=IP;
lpHost = gethostbyname(IP);
if(lpHost == NULL) return FALSE;
//添参数
local.sin_addr.s_addr = *((u_long FAR *)(lpHost->h_addr));
local.sin_family = AF_INET;
local.sin_port = htons(port);
if(bind(m_sServer, (struct sockaddr *)&local, sizeof(local)) == SOCKET_ERROR)
{
err = WSAGetLastError();
closesocket(m_sServer);
return FALSE;
}
//开始侦听
if(listen(m_sServer, backlog) != 0)
{
err = WSAGetLastError();
closesocket(m_sServer);
return FALSE;
}
m_nServerPort = port;
m_bListened = TRUE;
m_bNeedCloseServer = TRUE;
return TRUE;
}
BOOL WSocket::StartServer(DEALPROC lpDealFunc)
{
if(!m_bListened) return -1;
if(m_sServer == NULL) return -1;
DWORD dwThreadId;
SERVERPARA *para;
para = new SERVERPARA;
para->s = m_sServer;
para->port = m_nServerPort;
para->lpDealFunc = lpDealFunc;
m_hServerThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(&WSocket::ServerProc), (LPVOID)(para), 0, &dwThreadId);
if(m_hServerThread == NULL)
{
delete para;
err = WSAGetLastError();
return FALSE;
}
printf("%s","启动服务器\n");
return TRUE;
}
DWORD WSocket::ServerProc(LPVOID lpParm)
{
SERVERPARA *para = (SERVERPARA*)lpParm;
if(para == NULL) return -1;
SOCKET s = para->s;
int port = para->port;
DEALPROC lpDealFunc = para->lpDealFunc;
delete para;
SOCKET sClient;
struct sockaddr_in addr;
int iAddrSize= sizeof(addr);
char IP[32];
HANDLE hThread;
DWORD dwThreadId;
DEALPARA *parac;
while(1)
{
printf("进入监听状态\n");
sClient = accept(s, (struct sockaddr *)&addr, &iAddrSize);
printf("%d\n",sClient);
if(sClient == SOCKET_ERROR) {
int error=WSAGetLastError();
break;
}
sprintf(IP, "%d.%d.%d.%d", addr.sin_addr.S_un.S_un_b.s_b1,
addr.sin_addr.S_un.S_un_b.s_b2,
addr.sin_addr.S_un.S_un_b.s_b3,
addr.sin_addr.S_un.S_un_b.s_b4);
parac = new DEALPARA;
memset(parac->IP, 0, sizeof(parac->IP));
parac->s = sClient;
parac->port = port;
parac->lpDealFunc = lpDealFunc;
memcpy(parac->IP, IP, strlen(IP));
//侦听到连接,开一个线程
hThread = CreateThread(NULL, 0, DealProc, (LPVOID)(parac), 0, &dwThreadId);
InsertIntoSendline(sClient,addr);
printf("将%s添加到连接队列",IP);
if(hThread == NULL) delete parac;
printf("启动一个服务器线程:%d\n",hThread);
}
return 0;
}
服务器启动以后我建立了一个线程开始监听,但调试发现accept根本没有阻塞!请高手指点