BOOL Listen( int nConnectionBacklog = 5 );
参数
nConnectionBacklog 挂起的连接队列可以增大到的最大长度。 有效范围为从1到5。如果数值超出1-5的范围,则缺省为5;
非零,如果函数运行成功;否则0和特定错误代码可以通过调用 GetLastError检索。 下面的错误适用于此成员函数:
WSANOTINITIALISED 的成功的 AfxSocketInit 必须在使用此API之前发生。
WSAENETDOWN Windows套接字实现检测网络子系统失败。
WSAEADDRINUSE 尝试在使用中的地址进行侦听。
块Windows套接字操作的WSAEINPROGRESS 的进度中。
WSAEINVAL 套接字尚未绑定与 Bind 还尚未连接。
WSAEISCONN 套接字已连接。
WSAEMFILE 没有其他文件描述符不可用。
WSAENOBUFS 没有缓冲区空间可用。
WSAENOTSOCK 描述符不是套接字。
WSAEOPNOTSUPP 引用的套接字不支持 Listen 操作的类型。
virtual void OnAccept( int nErrorCode );
例子:
void CSocketServer::OnAccept(int nErrorCode)
{
CServerApp* pApp = (CServerApp*)AfxGetApp();
CServerDlg* pDlg = (CServerDlg*)pApp->m_pMainWnd;
CString pLog;
if (nErrorCode)
{
if (nErrorCode == WSAENETDOWN)
{
pLog.Format(_T("网络故障!"));
return;
}
else
{
pLog.Format(_T("FD_ACCEPT未知故障!故障代码:%d"),nErrorCode);
return;
}
}
else
{
sockaddr address;
CString IPaddr;
UINT port; //端口类型
int address_len = sizeof(address);
CSocketClient*pSocket = new CSocketClient();
if (Accept(*pSocket, &address, &address_len))
{
pSocket->GetPeerName(IPaddr,port);
pSocket->m_szIP = IPaddr;
m_ClientList.AddTail(pSocket);
pLog.Format(_T("接入客户端连接:IP=%s,端口=%d"), IPaddr, port);
pSocket->AsyncSelect(FD_READ);
}
else
{
int error = GetLastError();
if (error == WSAECONNREFUSED)
{
pLog.Format(_T("拒绝连接!"));
}
else
{
pLog.Format(_T("WSAACCEPT失败,错误代码:%d"), error);
}
delete pSocket;
return;
}
pDlg->m_Edit_Log += pLog;
pDlg->UpdateData(FALSE);
}
CAsyncSocket::OnAccept(nErrorCode);
}