server程序只能收到FD_ACCEPT,其他的都收不到!!
客户程序应该没问题,客户程序连接server,MessageBox(NULL,"FD_ACCEPT有工作站连接上了服务器。",0,0);可是退出,发送消息等都没反映。不知道哪里错了,请高手帮助
server代码如下: SOCKET Accept,ServerSocket,SocketArray[WSA_MAXIMUM_WAIT_EVENTS]; //SOCKET
SOCKADDR_IN m_sockServerAddr; //SOCKET 结构
BOOL IsTrue;
WSAEVENT hEvent,EventArray[WSA_MAXIMUM_WAIT_EVENTS];
WSANETWORKEVENTS nevents;
DWORD Index,i ;
DWORD EventTotal = 0;
void RunSockServer(); //启动sock
void OnAccept();
RunSockServer(); //启动sock
while(true)
{
OnAccept( );
}
void RunSockServer()
{
//初始化与绑定服务器
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL
{
MessageBox(NULL,"Winsock can not init !",0,0);
WSACleanup();
return;
}
ServerSocket=socket(PF_INET,SOCK_STREAM,0); //创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信 if(ServerSocket == INVALID_SOCKET)
{
MessageBox(NULL,"无法创建服务器socket !",0,0);
return;
} m_sockServerAddr.sin_family = AF_INET;
m_sockServerAddr.sin_addr.s_addr = INADDR_ANY; //向所有的IP地址发送消息
m_sockServerAddr.sin_port = htons(8001); if (bind(ServerSocket,(LPSOCKADDR)&m_sockServerAddr,sizeof(m_sockServerAddr)) == SOCKET_ERROR) //与选定的端口绑定
{
MessageBox(NULL,"无法绑定服务器 !",0,0);
return;
} hEvent = WSACreateEvent();
int result = WSAEventSelect(ServerSocket,hEvent,FD_ACCEPT |FD_READ| FD_WRITE|FD_CLOSE);
if(result == SOCKET_ERROR)
{
MessageBox(NULL,"SOCKET_ERROR !",0,0);
return ;
}
if (listen(ServerSocket,5) == SOCKET_ERROR) //开始监听客户连接请求
{
MessageBox(NULL,"服务器监听失败 !",0,0);
return;
}
SocketArray[EventTotal] = ServerSocket;
EventArray[EventTotal] = hEvent;
EventTotal++;
IsTrue = TRUE;
MessageBox(NULL,"服务器绑定监听成功 !",0,0);
return;
}
void OnAccept()
{//自定义接收客户机请求的消息
Index=WSAWaitForMultipleEvents(EventTotal,EventArray,FALSE,WSA_INFINITE,FALSE);
Index= Index - WSA_WAIT_EVENT_0; for (i = Index;i<EventTotal;i++)
{
Index=WSAWaitForMultipleEvents(1,&EventArray[i],TRUE,1000,FALSE);
if ((Index == WSA_WAIT_FAILED)||(Index== WSA_WAIT_TIMEOUT))
continue;
else
{
Index = i;
WSAEnumNetworkEvents(SocketArray[Index],EventArray[Index],&nevents);
if (nevents.lNetworkEvents &FD_ACCEPT)
{
Accept = accept(SocketArray[Index],NULL,NULL);
if (EventTotal > WSA_MAXIMUM_WAIT_EVENTS)
{
MessageBox(NULL,"EventTotal > WSA_MAXIMUM_WAIT_EVENTS",0,0);
closesocket(Accept);
break;
}
hEvent = WSACreateEvent();
int result = WSAEventSelect(ServerSocket,hEvent,FD_ACCEPT |FD_CLOSE);
if(result == SOCKET_ERROR)
{
MessageBox(NULL,"SOCKET_ERROR !",0,0);
return ;
}
SocketArray[EventTotal] = Accept;
EventArray[EventTotal] = hEvent;
EventTotal++;
MessageBox(NULL,"FD_ACCEPT有工作站连接上了服务器。",0,0);
} if (nevents.lNetworkEvents &FD_READ)
{
MessageBox(NULL,"FD_READ。",0,0);
} if (nevents.lNetworkEvents &FD_WRITE)
{
MessageBox(NULL,"FD_WRITE。",0,0);
} if (nevents.lNetworkEvents &FD_CLOSE)
{
closesocket(SocketArray[Index]);
EventTotal--;
MessageBox(NULL,"关闭。",0,0); }
}
}
return ;
}
客户程序应该没问题,客户程序连接server,MessageBox(NULL,"FD_ACCEPT有工作站连接上了服务器。",0,0);可是退出,发送消息等都没反映。不知道哪里错了,请高手帮助
server代码如下: SOCKET Accept,ServerSocket,SocketArray[WSA_MAXIMUM_WAIT_EVENTS]; //SOCKET
SOCKADDR_IN m_sockServerAddr; //SOCKET 结构
BOOL IsTrue;
WSAEVENT hEvent,EventArray[WSA_MAXIMUM_WAIT_EVENTS];
WSANETWORKEVENTS nevents;
DWORD Index,i ;
DWORD EventTotal = 0;
void RunSockServer(); //启动sock
void OnAccept();
RunSockServer(); //启动sock
while(true)
{
OnAccept( );
}
void RunSockServer()
{
//初始化与绑定服务器
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL
{
MessageBox(NULL,"Winsock can not init !",0,0);
WSACleanup();
return;
}
ServerSocket=socket(PF_INET,SOCK_STREAM,0); //创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信 if(ServerSocket == INVALID_SOCKET)
{
MessageBox(NULL,"无法创建服务器socket !",0,0);
return;
} m_sockServerAddr.sin_family = AF_INET;
m_sockServerAddr.sin_addr.s_addr = INADDR_ANY; //向所有的IP地址发送消息
m_sockServerAddr.sin_port = htons(8001); if (bind(ServerSocket,(LPSOCKADDR)&m_sockServerAddr,sizeof(m_sockServerAddr)) == SOCKET_ERROR) //与选定的端口绑定
{
MessageBox(NULL,"无法绑定服务器 !",0,0);
return;
} hEvent = WSACreateEvent();
int result = WSAEventSelect(ServerSocket,hEvent,FD_ACCEPT |FD_READ| FD_WRITE|FD_CLOSE);
if(result == SOCKET_ERROR)
{
MessageBox(NULL,"SOCKET_ERROR !",0,0);
return ;
}
if (listen(ServerSocket,5) == SOCKET_ERROR) //开始监听客户连接请求
{
MessageBox(NULL,"服务器监听失败 !",0,0);
return;
}
SocketArray[EventTotal] = ServerSocket;
EventArray[EventTotal] = hEvent;
EventTotal++;
IsTrue = TRUE;
MessageBox(NULL,"服务器绑定监听成功 !",0,0);
return;
}
void OnAccept()
{//自定义接收客户机请求的消息
Index=WSAWaitForMultipleEvents(EventTotal,EventArray,FALSE,WSA_INFINITE,FALSE);
Index= Index - WSA_WAIT_EVENT_0; for (i = Index;i<EventTotal;i++)
{
Index=WSAWaitForMultipleEvents(1,&EventArray[i],TRUE,1000,FALSE);
if ((Index == WSA_WAIT_FAILED)||(Index== WSA_WAIT_TIMEOUT))
continue;
else
{
Index = i;
WSAEnumNetworkEvents(SocketArray[Index],EventArray[Index],&nevents);
if (nevents.lNetworkEvents &FD_ACCEPT)
{
Accept = accept(SocketArray[Index],NULL,NULL);
if (EventTotal > WSA_MAXIMUM_WAIT_EVENTS)
{
MessageBox(NULL,"EventTotal > WSA_MAXIMUM_WAIT_EVENTS",0,0);
closesocket(Accept);
break;
}
hEvent = WSACreateEvent();
int result = WSAEventSelect(ServerSocket,hEvent,FD_ACCEPT |FD_CLOSE);
if(result == SOCKET_ERROR)
{
MessageBox(NULL,"SOCKET_ERROR !",0,0);
return ;
}
SocketArray[EventTotal] = Accept;
EventArray[EventTotal] = hEvent;
EventTotal++;
MessageBox(NULL,"FD_ACCEPT有工作站连接上了服务器。",0,0);
} if (nevents.lNetworkEvents &FD_READ)
{
MessageBox(NULL,"FD_READ。",0,0);
} if (nevents.lNetworkEvents &FD_WRITE)
{
MessageBox(NULL,"FD_WRITE。",0,0);
} if (nevents.lNetworkEvents &FD_CLOSE)
{
closesocket(SocketArray[Index]);
EventTotal--;
MessageBox(NULL,"关闭。",0,0); }
}
}
return ;
}
解决方案 »
- wincap抓包,希望高手给与解答,感激不尽!
- 急!请教:在EVC下如何实现像Cristi Posea做的CSizingControlBar的程序
- typedef (unsigned char) 年级;for(年级 i = 1;i < = 2;i++) 猴急;
- 学习win32还会有用吗?看了这则新闻,我有些担心。
- 有关于c++图象处理?
- 或许有一天我会写下: 堕落前征女友
- 上下左右键的问题?
- 求助,关于函数CreateProcess
- 音量百分比与分贝的关系
- 【急】新手求解要如何重新开始游戏
- 如何启动一个多文档程序时,不让它打开一个文档,而仅仅显示框架框口及其菜单?
- 关于 SQLConfigDataSource
int result = WSAEventSelect(ServerSocket,hEvent,FD_ACCEPT |FD_CLOSE);
错误,应该改为:int result = WSAEventSelect(Accept,hEvent,FD_WRITE|FD_SEND |FD_CLOSE);
accept得到的socket等待read、write、close三个事件