关于winsock程序中的服务器端不停产生FD_READ事件导致死循环问题.
1.建立一个面向连接的服务器程序,从WSASetup()->Socket()->bind()->listen()->后,加入:
WSAAsyncSelect(server,GetSafeHwnd(),WM_SOCKET_ACCECPT,FD_ACCEPT);
2.添加WM_SOCKET_ACCECPT的消息处理函数,调用accept()之后添加:
WSAAsyncSelect(client,GetSafeHwnd(),WM_SOCKET_MSG,FD_READ|FD_WRITE|FD_CLOSE);
3.添加WM_SOCKET_MSG的消息处理函数,如下:
CString sMSG;
char rbuf[50];
memset(rbuf,0,sizeof(rbuf));
int msg = lParam & 0x0000FFFF;
int rcnt=0;
switch(msg)
{
case FD_READ:// 接收数据
if((rcnt=recv(client,rbuf,strlen(rbuf),0))==SOCKET_ERROR )
{
CString sMSG;
sMSG.Format("socket接收失败,错误代码=%d",WSAGetLastError());
AfxMessageBox(sMSG);
}
else
{
if(rcnt>0)
{
rbuf[rcnt]='\0';
CString sMSG;
sMSG="接收到的消息是 : "+CString(rbuf);
//AfxMessageBox(sMSG);
m_ListBox.AddString(sMSG);
memset(rbuf,0,sizeof(rbuf));
WSAAsyncSelect(client,GetSafeHwnd(),0,0);}
}
break;
case FD_WRITE://发送数据
break;
case FD_CLOSE://关闭连接
m_ListBox.AddString("客户端关闭");
closesocket(client);
WSAAsyncSelect(client,GetSafeHwnd(),0,0);
break;
}现在出现的问题是,一旦客户端发送一次数据,服务器端没完没了的产生FD_READ事件,导致程序出现死循环.反复调用case FD_READ:后的代码.
1.建立一个面向连接的服务器程序,从WSASetup()->Socket()->bind()->listen()->后,加入:
WSAAsyncSelect(server,GetSafeHwnd(),WM_SOCKET_ACCECPT,FD_ACCEPT);
2.添加WM_SOCKET_ACCECPT的消息处理函数,调用accept()之后添加:
WSAAsyncSelect(client,GetSafeHwnd(),WM_SOCKET_MSG,FD_READ|FD_WRITE|FD_CLOSE);
3.添加WM_SOCKET_MSG的消息处理函数,如下:
CString sMSG;
char rbuf[50];
memset(rbuf,0,sizeof(rbuf));
int msg = lParam & 0x0000FFFF;
int rcnt=0;
switch(msg)
{
case FD_READ:// 接收数据
if((rcnt=recv(client,rbuf,strlen(rbuf),0))==SOCKET_ERROR )
{
CString sMSG;
sMSG.Format("socket接收失败,错误代码=%d",WSAGetLastError());
AfxMessageBox(sMSG);
}
else
{
if(rcnt>0)
{
rbuf[rcnt]='\0';
CString sMSG;
sMSG="接收到的消息是 : "+CString(rbuf);
//AfxMessageBox(sMSG);
m_ListBox.AddString(sMSG);
memset(rbuf,0,sizeof(rbuf));
WSAAsyncSelect(client,GetSafeHwnd(),0,0);}
}
break;
case FD_WRITE://发送数据
break;
case FD_CLOSE://关闭连接
m_ListBox.AddString("客户端关闭");
closesocket(client);
WSAAsyncSelect(client,GetSafeHwnd(),0,0);
break;
}现在出现的问题是,一旦客户端发送一次数据,服务器端没完没了的产生FD_READ事件,导致程序出现死循环.反复调用case FD_READ:后的代码.
memset(rbuf,XX,sizeof(rbuf));XX不等于零!程序就正常呢.
但从程序逻辑上讲,应该在recv之前做memset
感谢truemann(CodingWithJoy) 给的提示