请问accept()函数二次被调用时报错10014是何故,谢谢!(附函数)

xuewenxp 2004-07-22 11:37:12
函数如下:
int RecvMsg()
{
int rc, ret = 0, iAccpetAddrLen;
struct fd_set fdread;
struct timeval timeout;
SOCKET sockServer;
SOCKADDR_IN AcceptAddr;

rc = listen(g_sockListening, 1);
if (rc == SOCKET_ERROR)
{
closesocket(g_sockListening);
return -1;
}

FD_ZERO(&fdread);
FD_SET(g_sockListening, &fdread);

timeout.tv_sec = 5;
timeout.tv_usec = 0;

rc = select(0, &fdread, NULL, NULL, &timeout);
if (rc == SOCKET_ERROR)
{
closesocket(g_sockListening);
return -1; //select failed
}
else if (rc == 0)
{
// timeout: ret = 0
}
else
{
if (FD_ISSET(g_sockListening, &fdread))
{
sockServer = accept(g_sockListening, (SOCKADDR *)&AcceptAddr, &iAccpetAddrLen);
if (sockServer == INVALID_SOCKET)
{
cout << "accept failed with error " << WSAGetLastError() << endl;
closesocket(g_sockListening);
return -1;
}
...
}
}

closesocket(sockServer);

return ret;
}

在短连接方式下,本函数被循环调用,在第一次执行到accept()函数时可正常执行,而第二次执行到accept()函数就会报错10014。不知是否有那位朋友也遇到过类似问题,或能帮兄弟看出这里的疏漏,望不吝指教,谢谢!

PS:WSAEFAULT 10014:The addrlen parameter is too small or addr is not a valid part of the user address space.
...全文
203 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuewenxp 2004-07-27
  • 打赏
  • 举报
回复
楼上几位说的是,但我还是不太明白为什么iAccpetAddrLen未赋初值就会产生这样的错误。哪位能解释一下?谢谢!
xuewenxp 2004-07-23
  • 打赏
  • 举报
回复
谢谢!chenyc(兽医)兄说得是,listen不应放在这里,只调用listen一次就够了。只是兄的后一句“另外,调用局部变量应该变成全局变量,这样才能保持原来的连接。”我没有看懂,兄指的是哪个变量呢?
门吹西风 2004-07-23
  • 打赏
  • 举报
回复
iAccpetAddrLen没有赋初始值呀
xuewenxp 2004-07-22
  • 打赏
  • 举报
回复
MFCClass(8dog)兄说的极是,确实应该给i赋初值。在2000年6月版的msdn里函数accept()的参数addrlen的属性是[out],而在2004年7月版的msdn里却变成了[in, out]。
但为什么未赋初值就会导致这样的错误,还是没有彻底搞明白,望MFCClass(8dog)兄指教。谢谢!
MFCClass 2004-07-22
  • 打赏
  • 举报
回复
AccpetAddrLen没有副值
chenyc 2004-07-22
  • 打赏
  • 举报
回复
每次都要调用listen函数侦听一次,这个函数不应该放在循环里。
另外,调用局部变量应该变成全局变量,这样才能保持原来的连接。

18,356

社区成员

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

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