服务器端应采用监听手段,使用listen
解决方案 »
- 那如果有N个样本,大小是nx2维,那他的协方差还是2*2吗
- 闲聊一下,一个比较优秀的程序员一天得写多少行代码
- 如何区分是普通网卡还是无线网卡在上网?
- 急!opendocumentfile(null)出错!!
- 在上海的兄弟帮个忙,从火车站到浦东南路华申大厦坐出租要多少钱?
- 线程之间的通讯,谁做过这样的程序呀,有什么好办法,近来聊聊.
- @”在线等待“--<<深入解析ATL>>的源代码哪里下载?
- 怎么实现串口发送文件进度的进度条指示
- VC操作EXCEL,经常弹出“OFFICE修复”的对话框,如何屏蔽,急!!!
- 问一个COM与多线程的菜鸟问题
- 在Console中调用COM和在单文档中调用COM有什么不同?
- 关于是用socket api程序
我在View中listen():
// 初始化Winsock, 加载2.0版本的动态链接库
if (WSAStartup(0x202, &wsaData) == SOCKET_ERROR)
{
CString m_str;
m_str.Format("%d", WSAGetLastError());
m_str = "SOCKET动态链接库加载失败!错误代码:" + m_str;
AfxMessageBox(m_str, MB_OK|MB_ICONSTOP);
WSACleanup();
}m_pSocket = new CListenSock();// 创建一个指向新生成的socket的指针if (m_pSocket->Create(PortDialog.m_nPort, SOCK_STREAM, NULL))
{
m_pSocket->Bind(PortDialog.m_nPort, NULL);
this->pDoc->listen_socket = m_pSocket;
this->pDoc->listen_socket->Listen();
}说明:
m_pSocket为View的成员变量;
listen_socket是Doc的成员变量;
在我自己新建的类中的OnAccept()中,有:
void CListenSock::OnAccept(int nErrorCode)
{
// 通知receive线程准备开始接收
((CMyServerApp*)AfxGetApp())->pServerView->AcceptStart.SetEvent();
CAsyncSocket::OnAccept(nErrorCode);
}
这里的目的是激发线程执行。但是,程序并没有走到OnAccept()中。
做法如下:
CListenSocket* pListen = new CListenSocket;
pListen->Create(nPost, SOCK_STREAM, NULL);
pListen->Listen(5); CConnectSocket* pConnect = new CConnectSocket;
pListen->Accept(*pConnect);这样你的CListenSocket的OnAccept会触发。另处,你的代码中Bind是不需要的。
"Call this member function to associate a local address with the socket. This routine is used on an unconnected datagram or stream socket, before subsequent Connect or Listen calls. Before it can accept connection requests, a listening server socket must select a port number and make it known to Windows Sockets by calling Bind. Bind establishes the local association (host address/port number) of the socket by assigning a local name to an unnamed socket."
if (pSocket == NULL)
{
// Must be in the middle of an Accept call
pSocket = CAsyncSocket::LookupHandle(INVALID_SOCKET, FALSE);
ASSERT(pSocket != NULL);
pSocket->m_hSocket = (SOCKET)wParam;
CAsyncSocket::DetachHandle(INVALID_SOCKET, FALSE);
CAsyncSocket::AttachHandle(pSocket->m_hSocket, pSocket, FALSE);
}"
在其中的line: "ASSERT(pSocket != NULL);"(line 512)出错,我不知道这个函数是干什么用的,因为MSDN里面对它只字未提。希望有人能知道并给与解答。
我没用过CAsyncSocket,以前作socket只用过CSocket所以不知道LookupHandle是干什么用的,但是现象来看好像你的pSocket没有创建成功....
(FD_ACCEPT)啊,你再试试看
记得生成一个连接时也要
AsyncSelect::AsyncSelect(FD_WRITE|FD_READ|FD_CLOSE)的我看你还不如用CSocket来,它是什么也不用管了
二、如果没有打开,肯定是初始化没有成功。
我猜原因可能是你没有调用AfxSockInit(....)
因为我也经常遇到这个问题。:)
你是否使用了多线程?并且在不同的线程中使用了同一个SOCEKT?如果是,那么问题就大了,VC有BUG,在线程之间传递MFC对象很容易出问题(尤其是SOCKET!)
如果你一定要这样做,那你得使用DETACH和ATTACH,并且需要加一段补丁代码。如果只是创建SOCKET不成功,你可以在CREATE和LISTEN后调用GETLASTERROR
listen之前要加上CAsyncSocket::AsyncSelect(FD_ACCEPT);
楼上说的不对,此句不是必需的。CREATE函数原形为:
BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE, LPCTSTR lpszSocketAddress = NULL );因此,不必另行调用SELECT