可不可以通过recv的返回值来判断tcp连接是否断开?

gohappy_1999 2005-11-18 10:07:50
各位说说
...全文
567 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghxmagic 2005-11-21
  • 打赏
  • 举报
回复
正如上面所说的,如何recv函数返回0就是发生通讯失败了.你可以在这种情况下用shutdown函数进行确认.
......
else if (rcved_len == 0)
{
int iLastErr = 0;
iShutdown = shutdown(*pFd, 0);
/*Begin OS dependent*/
#ifdef _WIN32
iLastErr = WSAGetLastError();
if ( iShutdown == SOCKET_ERROR
&& (iLastErr == WSAENETDOWN || iLastErr == WSAENOTCONN) )
{
errno = iLastErr + ERRNO_MAX;
#else
if ( iShutdown == -1
&& errno == ENOTCONN )
{
#endif
/*End OS dependent*/
/* communication failed */
pErrMsg->ucErrMsg = PMONTHRE_ERR_151_COMM_FAILED;
}
else
{
pErrMsg->ucErrMsg = PMONTHRE_ERR_900_SYSTEMCALL_FAILED;
}

strcpy(pErrMsg->szFuncName, "recv");
pErrMsg->iErrNo = errno;
pErrMsg->iDetailCode = _ID_PMONThreMsgRecv | 0x00000006;

goto l_error;
}
......
nuaawenlin 2005-11-20
  • 打赏
  • 举报
回复
可以的
bluekite 2005-11-20
  • 打赏
  • 举报
回复
WSAGetLastError() == 10054

在這個論壇上近期也有類似的帖子, 你找一下.
DentistryDoctor 2005-11-20
  • 打赏
  • 举报
回复
WSAGetLastError();
gohappy_1999 2005-11-20
  • 打赏
  • 举报
回复
up
gohappy_1999 2005-11-18
  • 打赏
  • 举报
回复
那么连接端开时一定返回0吗,连接断开可能是异常断开,也可能是正常关闭
快乐鹦鹉 2005-11-18
  • 打赏
  • 举报
回复
If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.

因此,当返回值为0时,认为tcp连接已经断开。
gohappy_1999 2005-11-18
  • 打赏
  • 举报
回复
补充一下:SOCKET为阻塞模式

18,356

社区成员

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

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