关于WSAAsyncSelect(异步)与重叠I/O的综合使用,该如何解决
关于WSAAsyncSelect(异步)与重叠I/O的综合使用
关于WSAAsyncSelect(异步)与重叠I/O的综合使用
请大家帮忙看一下哪里有错误,谢谢!
short CServerSocket::StartupSocket()
{
int iErrorCode;
//产生相应传递给窗口的信息为 WM_SERVER_ACCEPT 此信息为自定义
iErrorCode = WSAAsyncSelect(m_hSocketServer, AfxGetApp()-> GetMainWnd()-> m_hWnd,WM_SOCKET_SERVER, FD_ACCEPT | FD_READ | FD_CLOSE );
// WSAAsyncSelect failed on socket
if(iErrorCode == SOCKET_ERROR)
{
//异步SOCKET失败
char chError[56];
LoadString(NULL,IDS_ASYNCSOCKET,chError,sizeof(chError));
MessageBox(NULL, chError, chCaption, MB_OK);
return 4;
}
if(listen(m_hSocketServer, nMaxListenUser) == SOCKET_ERROR)
{
//监听SOCKET失败
char chError[56];
LoadString(NULL,IDS_LISTENSOCKET,chError,sizeof(chError));
MessageBox(NULL, chError, chCaption, MB_OK);
return 5;
}
return 0;
}
LRESULT CServerSocket::OnAccept(WPARAM wParam,LPARAM lParam)
{
nSockIndex = GetEmptySocket();
int nLength = sizeof(m_SockClientaddr[nSockIndex]);
m_hSocketClient[nSockIndex] = accept(m_hSocketServer,(sockaddr *)&m_SockClientaddr[nSockIndex], &nLength);
m_hEvent[nSockIndex] = WSACreateEvent();
//SOCKADDR_IN acceptaddr;
//int nlen = sizeof(acceptaddr);
//SOCKET m_Client = accept(m_hSocketServer,(sockaddr *)&acceptaddr,&nlen);
//if(m_Client == SOCKET_ERROR)
//{
//服务器接收SOCKET错误!
//char chError[56], chCaption[56];
//memset(chError, 0, sizeof(chError));
//memset(chCaption, 0, sizeof(chCaption));
//LoadString(NULL, IDS_SOCKET, chCaption, sizeof(chCaption));
//LoadString(NULL,IDS_ACCEPTSOCKET,chError,sizeof(chError));
//MessageBox(NULL, chError, chCaption, MB_OK);
//WSAGetLastError();
//return -1L;
//}
//int nlen = sizeof(m_sockServerAddr);
//m_hSocketClient = accept(m_hSocketServer,(sockaddr *)&m_sockServerAddr, &nlen);
//HANDLE hHandle = AfxBeginThread(TalkToClient, (LPVOID)m_hSocketClient);
//if(hHandle == NULL)
//{
// int nStatus=closesocket(m_hSocketClient);
// if(nStatus == NULL)
// return 0L;
//}
return 0L;
}
UINT CServerSocket::TalkToClient(void *sockclient)
{
int iResult;
char buffer[MAXDATASIZE];
memset(buffer, 0, sizeof(buffer));
SOCKET clientSocket=(SOCKET)sockclient;
while(1)
{
iResult = recv(clientSocket, (char*)buffer, sizeof(buffer), 0);
if(iResult == 0 || iResult == SOCKET_ERROR)
{
AfxEndThread(0); break;
}
buffer[iResult]= _T( '\0 ');
TRACE0(_T(buffer));
AfxMessageBox(buffer);
}
ExitThread(0);
关于WSAAsyncSelect(异步)与重叠I/O的综合使用
请大家帮忙看一下哪里有错误,谢谢!
short CServerSocket::StartupSocket()
{
int iErrorCode;
//产生相应传递给窗口的信息为 WM_SERVER_ACCEPT 此信息为自定义
iErrorCode = WSAAsyncSelect(m_hSocketServer, AfxGetApp()-> GetMainWnd()-> m_hWnd,WM_SOCKET_SERVER, FD_ACCEPT | FD_READ | FD_CLOSE );
// WSAAsyncSelect failed on socket
if(iErrorCode == SOCKET_ERROR)
{
//异步SOCKET失败
char chError[56];
LoadString(NULL,IDS_ASYNCSOCKET,chError,sizeof(chError));
MessageBox(NULL, chError, chCaption, MB_OK);
return 4;
}
if(listen(m_hSocketServer, nMaxListenUser) == SOCKET_ERROR)
{
//监听SOCKET失败
char chError[56];
LoadString(NULL,IDS_LISTENSOCKET,chError,sizeof(chError));
MessageBox(NULL, chError, chCaption, MB_OK);
return 5;
}
return 0;
}
LRESULT CServerSocket::OnAccept(WPARAM wParam,LPARAM lParam)
{
nSockIndex = GetEmptySocket();
int nLength = sizeof(m_SockClientaddr[nSockIndex]);
m_hSocketClient[nSockIndex] = accept(m_hSocketServer,(sockaddr *)&m_SockClientaddr[nSockIndex], &nLength);
m_hEvent[nSockIndex] = WSACreateEvent();
//SOCKADDR_IN acceptaddr;
//int nlen = sizeof(acceptaddr);
//SOCKET m_Client = accept(m_hSocketServer,(sockaddr *)&acceptaddr,&nlen);
//if(m_Client == SOCKET_ERROR)
//{
//服务器接收SOCKET错误!
//char chError[56], chCaption[56];
//memset(chError, 0, sizeof(chError));
//memset(chCaption, 0, sizeof(chCaption));
//LoadString(NULL, IDS_SOCKET, chCaption, sizeof(chCaption));
//LoadString(NULL,IDS_ACCEPTSOCKET,chError,sizeof(chError));
//MessageBox(NULL, chError, chCaption, MB_OK);
//WSAGetLastError();
//return -1L;
//}
//int nlen = sizeof(m_sockServerAddr);
//m_hSocketClient = accept(m_hSocketServer,(sockaddr *)&m_sockServerAddr, &nlen);
//HANDLE hHandle = AfxBeginThread(TalkToClient, (LPVOID)m_hSocketClient);
//if(hHandle == NULL)
//{
// int nStatus=closesocket(m_hSocketClient);
// if(nStatus == NULL)
// return 0L;
//}
return 0L;
}
UINT CServerSocket::TalkToClient(void *sockclient)
{
int iResult;
char buffer[MAXDATASIZE];
memset(buffer, 0, sizeof(buffer));
SOCKET clientSocket=(SOCKET)sockclient;
while(1)
{
iResult = recv(clientSocket, (char*)buffer, sizeof(buffer), 0);
if(iResult == 0 || iResult == SOCKET_ERROR)
{
AfxEndThread(0); break;
}
buffer[iResult]= _T( '\0 ');
TRACE0(_T(buffer));
AfxMessageBox(buffer);
}
ExitThread(0);