新手的问题:accept()调用为何未阻塞?---请各位老大多多指点!

xuxinjun 2003-05-26 03:52:44


我在一个简单的基于对话框的应用中,初始化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);
}

}
...全文
75 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuxinjun 2003-05-26
  • 打赏
  • 举报
回复


谢谢啦,不是老大提醒还真不知怎回事。
windows_editor 2003-05-26
  • 打赏
  • 举报
回复
这里 加上 ClientAddrLen = sizeof(sockconnect);
windows_editor 2003-05-26
  • 打赏
  • 举报
回复
当然错拉

sockconnect=accept(socklisten,
(SOCKADDR*)&clientaddr,&ClientAddrLen);

最后一个参数 ClientAddrLen = sizeof(...);
你没分配内存嘛

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧