新手的问题:accept()调用为何未阻塞?---请各位老大多多指点!
我在一个简单的基于对话框的应用中,初始化winsock库后,调用socket()产生了一个SOCKET,然后依次调用bind,listen。我原以为单击“接受连接”按钮,代码的执行会在“接受连接”按钮单击响应代码的accept()调用处阻塞,而实际却没有,accept()调用返回为4294967295(显然是错误的),而且其后的recv()调用也马上返回了,返回值为SOCKET_ERROR,这是为何??
//OnInitDialog()函数代码。
BOOL CMsSockDlg::OnInitDialog()
{
CDialog::OnInitDialog();
int ret;
WSADATA wsadata;
if(ret=WSAStartup(MAKEWORD(2,2),&wsadata)!=0)
{
printf("Socket startup error,error code:%d",ret);
return false;
}
socklisten=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(5001);
addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
bind(socklisten,(SOCKADDR*)&addr,sizeof(addr));
listen(socklisten,5);
return TRUE;
}
//“接受连接”按钮单击响应代码
void CMsSockDlg::OnAccept()
{
// TODO: Add your control notification handler code here
SOCKET sockconnect;
SOCKADDR_IN clientaddr;
int ClientAddrLen;
sockconnect=accept(socklisten,
(SOCKADDR*)&clientaddr,&ClientAddrLen);
int ret;
char buf[30];
if(ret=recv(sockconnect,buf,30,0)==SOCKET_ERROR)
{
CString strtemp;
strtemp.Format("Failed receive, error code: %d \n",
WSAGetLastError());
AfxMessageBox(strtemp);
}
else
{
AfxMessageBox(buf);
}
}