快疯掉了,原来的问题还没有解决,又来信状况了:(我把大体的代码贴一下,大家帮我看看吧:(,真是郁闷
服务器端的:
SOCKET m_sListen;
WSADATA wsaData;WSAEVENT m_wAccEvenArr;
m_wAccEvenArr=WSACreateEvent();
if(WSAEventSelect(m_sListen,m_wAccEvenArr,FD_ACCEPT|FD_CLOSE)==SOCKET_ERROR)
{
CString str;
str.Format("%d",WSAGetLastError());
AfxMessageBox(str);
return FALSE;
}DWORD dwIndex;
dwIndex=WSAWaitForMultipleEvents(1,m_wAccEvenArr,FALSE,WSA_INFINITE,FALSE);
if(dwIndex==WSA_WAIT_FAILED)
{
AfxMessageBox(" ");
return FALSE;
}
dwIndex=dwIndex-WSA_WAIT_EVENT_0;
if(dwIndex==0)//FD_ACCEPT
{
WSANETWORKEVENTS wNetwokEvents;
SOCKET sAccept=INVALID_SOCKET;
if(WSAEnumNetworkEvents(m_sListen,m_wAccEvenArr,&wNetwokEvents) ==SOCKET_ERROR)
{
AfxMessageBox("WSAEnumNetworkEvents error");
return false;
}
if(wNetwokEvents.lNetworkEvents&FD_ACCEPT)
{
if(wNetwokEvents.iErrorCode[FD_ACCEPT_BIT]!=0)
{
AfxMessageBox("FD_ACCEPT error");
}
sAccept=accept(m_sListen,NULL,NULL);
if(sAccept==INVALID_SOCKET)
AfxMessageBox("Accept_Block error");
WSAEVENT pRecvEvent;
pRecvEvent=WSACreateEvent();
while(true)
{
if(WSAEventSelect(sAccept,pRecvEvent,FD_WRITE|FD_READ|FD_CLOSE)==SOCKET_ERROR)
{
CloseHandle((HANDLE)pRecvEvent);
CString str;
str.Format("%d",WSAGetLastError());
AfxMessageBox(str);
break;
}
DWORD dwWaitResult;
dwWaitResult = WSAWaitForMultipleEvents(1, pRecvEvent, FALSE,WSA_INFINITE,FALSE);
if (dwWaitResult==WSA_WAIT_FAILED)
{
WSAEventSelect(sAccept, pRecvEvent[1], 0);
CloseHandle(pRecvEvent);
return FALSE;
}
dwWaitResult=dwWaitResult-WSA_WAIT_EVENT_0;
if(dwWaitResult==0)
{
WSANETWORKEVENTS wNetworkEvents;
if(WSAEnumNetworkEvents(sAccept,pRecvEvent,&wNetworkEvents) == SOCKET_ERROR)
{
WSAEventSelect(sAccept, pRecvEvent, 0);
CloseHandle(pRecvEvent);
return false;
}
if(wNetworkEvents.lNetworkEvents&FD_READ||wNetworkEvents.lNetworkEvents&FD_WRITE||wNetworkEvents.lNetworkEvents&FD_CLOSE)
{
if(wNetworkEvents.lNetworkEvents&FD_READ&&wNetworkEvents.iErrorCode[FD_READ_BIT]!=0)
{
WSAEventSelect(sAccept,pRecvEvent, 0);
CloseHandle(pRecvEvent);
AfxMessageBox("FD_READ error");
break;
}
else
{
AfxMessageBox("触发了读事件");
int nRet;
int idx=0;
char buffer[256];
nRet=recv(sAccept,buffer,256,0);
if(nRet==SOCKET_ERROR)
{
CString str;
str.Format("读错误º%d",GetLastError());
AfxMessageBox(str);
break;
}
else
{
CString str;
buffer[nRet+1]='\0';
str=buffer;
AfxMessageBox(str);
ZeroMemory(buffer,256);
}
if(wNetworkEvents.lNetworkEvents&FD_CLOSE)///////就是这里一直有问题,如果加上这一断
{ ////客户端重新启动后,就提示100048,地址正在使用错误
AfxMessageBox("´触发了结束事件");//////若不加这一段,就可以连接成功!
closesocket(sAccept);////////////
return TRUE;///////////////该段!!!
}////////////////////////////
if(wNetworkEvents.lNetworkEvents&FD_WRITE&&wNetworkEvents.iErrorCode[FD_WRITE_BIT]!=0)
{
AfxMessageBox("FD_WRITE error");
WSAEventSelect(sAccept,pRecvEvent[1], 0);
CloseHandle(pRecvEvent[1]);
AfxMessageBox("FD_WRITE error");
break;
}
else
{
AfxMessageBox("´触发了写事件");
int nLeft=pSocketInfo->bytesSend;
int idx=0;
int nRet;
while(nLeft>0)
{
nRet=send(sAccept,&(pSocketInfo->bySend[idx]),nLeft,0); if(nRet=SOCKET_ERROR)
{
AfxMessageBox("写错误");
break;
}
nLeft=nRet;
idx+=nRet;
}
} }
WSAResetEvent(pRecvEvent);
}
}
return TRUE;
}客户端的代码:
客户端在连接成功后立即发送数据
CString str;
str="hello";
send(csock,str,str.GetLength(),0);
str.Empty();
客户端推出时
shutdown(csock,SD_BOTH
closesocket(csock);1 客户端连接成功后,立即向服务器发送消息“hello”,服务器端同时触发了FD_WRITE FD_READ网络事件,这正常吗?
2 当客户端closesocket(csock),服务器端也触发了FD_WRITE ,FD_READ网络事件,这个也正常吗?
3 当我在服务器端处理FD_CLOSE的消息时,执行AfxMessageBox("´触发了结束事件");
closesocket(sAccept);return true;这时如果我重新启动客户端再连接服务器端的时候,服务器端就一直返回100048,地址正在使用的错误,若我不处理FD_CLOSE这个消息,则客户端在重新启动的时候,也不会发生这种错误!!!这到底怎么回事呢?
服务器端的:
SOCKET m_sListen;
WSADATA wsaData;WSAEVENT m_wAccEvenArr;
m_wAccEvenArr=WSACreateEvent();
if(WSAEventSelect(m_sListen,m_wAccEvenArr,FD_ACCEPT|FD_CLOSE)==SOCKET_ERROR)
{
CString str;
str.Format("%d",WSAGetLastError());
AfxMessageBox(str);
return FALSE;
}DWORD dwIndex;
dwIndex=WSAWaitForMultipleEvents(1,m_wAccEvenArr,FALSE,WSA_INFINITE,FALSE);
if(dwIndex==WSA_WAIT_FAILED)
{
AfxMessageBox(" ");
return FALSE;
}
dwIndex=dwIndex-WSA_WAIT_EVENT_0;
if(dwIndex==0)//FD_ACCEPT
{
WSANETWORKEVENTS wNetwokEvents;
SOCKET sAccept=INVALID_SOCKET;
if(WSAEnumNetworkEvents(m_sListen,m_wAccEvenArr,&wNetwokEvents) ==SOCKET_ERROR)
{
AfxMessageBox("WSAEnumNetworkEvents error");
return false;
}
if(wNetwokEvents.lNetworkEvents&FD_ACCEPT)
{
if(wNetwokEvents.iErrorCode[FD_ACCEPT_BIT]!=0)
{
AfxMessageBox("FD_ACCEPT error");
}
sAccept=accept(m_sListen,NULL,NULL);
if(sAccept==INVALID_SOCKET)
AfxMessageBox("Accept_Block error");
WSAEVENT pRecvEvent;
pRecvEvent=WSACreateEvent();
while(true)
{
if(WSAEventSelect(sAccept,pRecvEvent,FD_WRITE|FD_READ|FD_CLOSE)==SOCKET_ERROR)
{
CloseHandle((HANDLE)pRecvEvent);
CString str;
str.Format("%d",WSAGetLastError());
AfxMessageBox(str);
break;
}
DWORD dwWaitResult;
dwWaitResult = WSAWaitForMultipleEvents(1, pRecvEvent, FALSE,WSA_INFINITE,FALSE);
if (dwWaitResult==WSA_WAIT_FAILED)
{
WSAEventSelect(sAccept, pRecvEvent[1], 0);
CloseHandle(pRecvEvent);
return FALSE;
}
dwWaitResult=dwWaitResult-WSA_WAIT_EVENT_0;
if(dwWaitResult==0)
{
WSANETWORKEVENTS wNetworkEvents;
if(WSAEnumNetworkEvents(sAccept,pRecvEvent,&wNetworkEvents) == SOCKET_ERROR)
{
WSAEventSelect(sAccept, pRecvEvent, 0);
CloseHandle(pRecvEvent);
return false;
}
if(wNetworkEvents.lNetworkEvents&FD_READ||wNetworkEvents.lNetworkEvents&FD_WRITE||wNetworkEvents.lNetworkEvents&FD_CLOSE)
{
if(wNetworkEvents.lNetworkEvents&FD_READ&&wNetworkEvents.iErrorCode[FD_READ_BIT]!=0)
{
WSAEventSelect(sAccept,pRecvEvent, 0);
CloseHandle(pRecvEvent);
AfxMessageBox("FD_READ error");
break;
}
else
{
AfxMessageBox("触发了读事件");
int nRet;
int idx=0;
char buffer[256];
nRet=recv(sAccept,buffer,256,0);
if(nRet==SOCKET_ERROR)
{
CString str;
str.Format("读错误º%d",GetLastError());
AfxMessageBox(str);
break;
}
else
{
CString str;
buffer[nRet+1]='\0';
str=buffer;
AfxMessageBox(str);
ZeroMemory(buffer,256);
}
if(wNetworkEvents.lNetworkEvents&FD_CLOSE)///////就是这里一直有问题,如果加上这一断
{ ////客户端重新启动后,就提示100048,地址正在使用错误
AfxMessageBox("´触发了结束事件");//////若不加这一段,就可以连接成功!
closesocket(sAccept);////////////
return TRUE;///////////////该段!!!
}////////////////////////////
if(wNetworkEvents.lNetworkEvents&FD_WRITE&&wNetworkEvents.iErrorCode[FD_WRITE_BIT]!=0)
{
AfxMessageBox("FD_WRITE error");
WSAEventSelect(sAccept,pRecvEvent[1], 0);
CloseHandle(pRecvEvent[1]);
AfxMessageBox("FD_WRITE error");
break;
}
else
{
AfxMessageBox("´触发了写事件");
int nLeft=pSocketInfo->bytesSend;
int idx=0;
int nRet;
while(nLeft>0)
{
nRet=send(sAccept,&(pSocketInfo->bySend[idx]),nLeft,0); if(nRet=SOCKET_ERROR)
{
AfxMessageBox("写错误");
break;
}
nLeft=nRet;
idx+=nRet;
}
} }
WSAResetEvent(pRecvEvent);
}
}
return TRUE;
}客户端的代码:
客户端在连接成功后立即发送数据
CString str;
str="hello";
send(csock,str,str.GetLength(),0);
str.Empty();
客户端推出时
shutdown(csock,SD_BOTH
closesocket(csock);1 客户端连接成功后,立即向服务器发送消息“hello”,服务器端同时触发了FD_WRITE FD_READ网络事件,这正常吗?
2 当客户端closesocket(csock),服务器端也触发了FD_WRITE ,FD_READ网络事件,这个也正常吗?
3 当我在服务器端处理FD_CLOSE的消息时,执行AfxMessageBox("´触发了结束事件");
closesocket(sAccept);return true;这时如果我重新启动客户端再连接服务器端的时候,服务器端就一直返回100048,地址正在使用的错误,若我不处理FD_CLOSE这个消息,则客户端在重新启动的时候,也不会发生这种错误!!!这到底怎么回事呢?
1、客户端连接成功,立刻触发fd_write;你立即发送消息,立刻触发fd_read,看起来是同时到达,实际是有先后的。
2、应该不会触发这个事件
3、你没有调用COLOSESOCKT(),所以会导致端口释放不了。
可是第三个问题,我在服务器和客户端都closesocket了